这是一个看似超级基本的问题,但我仍然找不到清除它的方法。当我有一个简单的继承,如B和C继承自A
A
|
|-----|
B C
让我们说这些界面就像:
public interface A
{
List<A> Children { get; }
}
我的问题:当我完成B.Children
时,每次我想使用其细节时,我都必须将其强制转换为B
。有没有办法让孩子列表而不必在继承树的叶子中声明孩子?
精度:子节点与父节点(或子类型)的类型始终相同。树可以更深。例如,考虑一个带有对象,容器,控件,标签的UI系统,其中一个类仅具有相同类型的子项或其自身的子类型。
这是我的代码。我的顶级为
public interface ITerm
{
String text { get; }
}
然后,由@Damien_The_Unbeliever提供
public interface ITerm<T> : ITerm where T : ITerm
{
List<T> Children { get; }
}
public interface ITermControl : ITerm<ITermControl> { ... }
public class TermControl : ITermControl { ... }
我开始认为访问List<ITerm> ITerm.Children
以及List<ITermControl> ITermControl.Children
毫无用处。这就是我试图解释的。
由于
答案 0 :(得分:4)
您可以尝试这样做:
public interface A<T> where T: A<T> {
List<T> Children {get;}
}
Eric Lippert在其文章Curiouser and Curiouser中描述的内容:
这是C ++中所谓的Curiously Recurring Template Pattern的C#变体,我将把它留给我更好的人来解释它在该语言中的用法。本质上,C#中的模式是尝试强制使用CRTP。
并指出它并不是真正强制执行正确的类型 - 所以充其量,它是一种文档形式,而不是阻止不良事件发生的东西。