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

时间:2014-09-28 21:42:36

标签: c# inheritance abstract-class base-class

在我的解决方案中,有许多类C1C2C3等等都继承自公共抽象基类CB

还有许多类D1D2D3等作为相应C类的数据源(例如数据 - C1的来源是D1等类型的本地属性。 D类都继承自公共抽象基类DB,但实现方式各不相同(C类使用了继承和非继承属性和方法。)< / p>

现在,我想强制规定所有C类(即源自CB必须实施&#34;数据源&#34;属性,此属性的类型必须派生自DB

我最初的想法是这样做:

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

    etc.
}

但是,这意味着DataSource类中被覆盖的C属性只能是DB类型,而不是从DB派生的类型。

我如何强加我的规则?理想情况下CBDB仍然是抽象基类(因为我希望CD类继承的每个都有非抽象属性和方法,但是如果需要,它们可以转换为接口。但是,如果我这样做,我认为我有完全相同的问题。

1 个答案:

答案 0 :(得分:4)

您正在寻找通用类:

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

    etc
}

现在,C1应定义为:

public class C1 : CB<D1>
{
    protected override D1 DataSource { get; set; }
}