类型参数的类型层次结构?

时间:2011-03-22 19:58:29

标签: c# inheritance

想象一下我用于构建树结构的类布局:

class Treenodebase
{
    Treenodebase Parent{get;set;}
    IEnumerable<Treenodebase> Children {get;set;}
}
class Specialtreenode : Treenodebase
{
    string SpecialProperty{get;set;}
    public string ParentsSpecialProperty()
    {
        return Parent.SpecialProperty; //here I'd need casting?!
    }
}
class Othertreenode : Treenodebase
{
    string OtherProperty {get;set;}
}

我在整个程序中使用子类来构建单独的树。这意味着每个Specialtreenode只有一个Specialtreenode类型的父类,以及Specialtreenode类型的子类。

剪辑很简单。基类还有更多属性(如IsSelected和IsExpanded)和方法(想想'祖先'或'兄弟姐妹'等)和子类。

我可以在某种程度上利用类型参数来避免在每个子类中进行转换吗?或者这总是涉及我的子类不继承自基类?

1 个答案:

答案 0 :(得分:3)

你可以这样做:

class Treenodebase<T> where T : Treenodebase<T>
{
    public T Parent{get;set;}
    public IEnumerable<T> Children {get;set;}
}
class Specialtreenode : Treenodebase<Specialtreenode>
{
    string SpecialProperty{get;set;}
    public string ParentsSpecialProperty()
    {
        return Parent.SpecialProperty;
    }
}

当然,这会消除非通用Treenodebase类型,这可能是好的也可能是坏的。如果您有许多实用方法并不真正关心您使用的实现,您可能希望使Treenodebase<T>扩展非泛型基类或实现非泛型接口。另一方面,您可能会发现更简单地将所有实用程序方法设置为一般类型。这取决于你在代码中如何使用树。