想象一下我用来构建树结构的类的布局:
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)和方法(例如“Ancestors”或“Siblings”等)以及子类。
我可以以某种方式利用这里的类型参数来避免在每个子类中进行转换吗?或者这总是涉及我的子类不从基类继承?
最佳答案
你可以这样做:
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>
扩展非泛型基类或实现非泛型接口(interface)。另一方面,您可能会发现将所有实用程序方法也设为通用类型会更容易。这取决于您在代码中如何使用树。
关于c# - 带有类型参数的类型层次结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5397064/