想象一下我用于构建树结构的类布局:
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)和方法(想想'祖先'或'兄弟姐妹'等)和子类。
我可以在某种程度上利用类型参数来避免在每个子类中进行转换吗?或者这总是涉及我的子类不继承自基类?
答案 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>
扩展非泛型基类或实现非泛型接口。另一方面,您可能会发现更简单地将所有实用程序方法设置为一般类型。这取决于你在代码中如何使用树。