用固有类中的[派生自基类属性]重写[抽象类]中的[抽象基类属性]

本文关键字:基类 属性 抽象类 抽象 中的 重写 派生 | 更新日期: 2024-10-22 00:30:28

我被不同的本质/抽象交互弄糊涂了。比方说,我有一个特定的类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类的过程中,用Derived类覆盖这个BaseClass

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

我之所以想这样做,是因为在我的代码的其他地方,我有一个AbstractBase的通用列表,有时我想访问AbstractBase.MyProperty.SomeGenericProperties,无论我使用哪种固有的基类实现,它们都存在,因为它们的MyProperty是从BaseClass 中固有的

用固有类中的[派生自基类属性]重写[抽象类]中的[抽象基类属性]

您需要使用C#泛型来解决这个问题。

快速实现如下所示:

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,如果您尝试使用不继承的类型,则编译实际上会失败。

这里还有一些关于泛型的额外阅读。

您需要为此使用泛型。

例如:

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; }
}