如何强制类实现派生自特定基类/接口(而不是特定类型)的属性

Lau*_*nce 2 c# inheritance abstract-class base-class

在我的解决方案中,有许多类C1,等等C2C3它们都继承自一个公共抽象基类CB

还有许多类D1D2D3充当相应C类的数据源(例如, 的数据源C1是类型D1等的本地属性)。这些D类都继承自一个公共抽象基类DB,但其实现有所不同(该类使用继承和非继承的属性和方法C)。

现在,我想强加一条规则,即所有C类(即派生自CB必须实现“数据源”属性,并且该属性的类型必须派生自DB

我最初的想法是这样做:

public abstract class CB
{
    protected abstract DB DataSource { get; set; } 

    etc.
}
Run Code Online (Sandbox Code Playgroud)

然而,这意味着类DataSource中被重写的属性C只能是类型DB,而不是派生自 的类型DB

我如何实施我的规则?理想情况下CB, 和DB仍将保留抽象基类(因为每个类中都有非抽象属性和方法,我希望CD类继承),但如果需要,它们可以转换为接口。但我认为如果我这样做的话我会遇到完全相同的问题。

Mar*_*zek 5

您正在寻找通用类:

public abstract class CB<T> where T : DB
{
    protected abstract T DataSource { get; set; } 

    etc
}
Run Code Online (Sandbox Code Playgroud)

现在,C1应该定义为:

public class C1 : CB<D1>
{
    protected override D1 DataSource { get; set; }
}
Run Code Online (Sandbox Code Playgroud)