c# - 带有类型参数的类型层次结构?

标签 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)和方法(例如“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/

相关文章:

c# - Task<T> 异步导致 Xamarin.iPhone (MonoTouch) JIT 错误?

java - 为什么 1_2_3_4 在 java 中是有效的整数文字?

java - this 关键字引用父变量

c# - Culture-Invariant 区分大小写的字符串比较在不同的机器上返回不同的结果

c# - 如何将 ArrayList 写入文本文件?

c# - 将 Guid 字符串转换为 BigInteger,反之亦然

c# - 禁止访问继承的 winform 控件

python - 如果子类中缺少 __init__() 会发生什么?

c++ - 在多个 ui 文件之间拆分 Qt 表单

c# - 通过 T4 代码生成自动 INotifyPropertyChanged 实现?