在[abstract class]中使用[derived-from-baseclass-property]在继承的类中重写[abstract baseclass property]

时间:2016-04-20 23:06:02

标签: c# inheritance abstract-class

我对不同的继承/抽象交互感到困惑。 假设我有一个名为BaseClass的类,现在在这个基类上我有多个继承的派生类,InherritedBaseClassA等。

class BaseClass
{
    int SomeGenericProperties {get; set;}    
}
class InherritedBaseClassA : BaseClass
{
    int PropertyOnlyInA {get; set;}
}
class InherritedBaseClassB : BaseClass
{
    int PropertyOnlyInB {get; set;}
}

现在我想将此BaseClass作为属性添加到abstract类中:

abstract class AbstractBase
{
   public abstract Baseclass MyProperty {get;set;}
}

最后,我想在我的abstract课程的实施中,用BaseClass课程覆盖这个Derived

class Implementation_A_OfAbstractBase : AbstractBase
{
    // how do i write this line?
    public override InherritedBaseClassA MyProperty;
}

我想这样做,因为我的代码中的其他地方有AbstractBase的通用列表,有时我想访问存在的AbstractBase.MyProperty.SomeGenericProperties,无论我使用什么类型的继承基类实现,因为它们{ {1}}继承自MyProperty

2 个答案:

答案 0 :(得分:1)

您将需要使用C#Generics来解决此问题。

快速实施如下:

abstract class AbstractBase<T> where T: Baseclass
{
    public abstract T MyProperty { get; set;}
}

class Implementation_A_OfAbstractBase : AbstractBase<InherritedBaseClassA>         
{
    //you no longer need to override the property, the generic type takes care of this for you.
}

重要的是要注意where T: Baseclass这将告诉编译器指定的类型将始终继承Baseclass,如果您尝试使用不支持的类型,编译实际上将失败。 / p>

另外here is some additional reading on generics.

答案 1 :(得分:0)

你需要使用泛型。

例如:

abstract class AbstractBase<T>
    where T : BaseClass
{
    public abstract T MyProperty { get; set; }
}

abstract class AbstractBase : AbstractBase<BaseClass>
{
}

class Implementation_A_OfAbstractBase : AbstractBase<InherritedBaseClassA>
{
    public override InherritedBaseClassA MyProperty { get; set; }
}