【问题标题】:How to force a class to implement a property that derives from a specific base class/interface (rather than is of a specific type)如何强制类实现派生自特定基类/接口(而不是特定类型)的属性
【发布时间】:2014-11-23 06:13:03
【问题描述】:

在我的解决方案中,有许多类C1C2C3 等都继承自一个通用抽象基类CB

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

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

我最初的想法是这样做:

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

    etc.
}

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

我怎样才能强加我的规则?理想情况下,CBDB 将保持抽象基类(因为我希望 CD 类继承非抽象属性和方法),但如果需要它们可以转换为接口.但是,如果我这样做,我认为我会遇到完全相同的问题。

【问题讨论】:

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


    【解决方案1】:

    您正在寻找泛型类:

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

    【讨论】:

    • 我理解第一个代码 sn-p,但是对于第二个代码,你不是说:C1 应该定义为: public class C1 : CB { protected override D1 DataSource { get;放; } }
    猜你喜欢
    • 2019-04-10
    • 2012-02-27
    • 2012-03-07
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    相关资源
    最近更新 更多