用固有类中的[派生自基类属性]重写[抽象类]中的[抽象基类属性]
本文关键字:基类 属性 抽象类 抽象 中的 重写 派生 | 更新日期: 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; }
}