避免在继承树中进行多次转换

时间:2013-07-01 06:19:37

标签: c# inheritance casting

这是一个看似超级基本的问题,但我仍然找不到清除它的方法。当我有一个简单的继承,如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毫无用处。这就是我试图解释的。

由于

1 个答案:

答案 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。

并指出它并不是真正强制执行正确的类型 - 所以充其量,它是一种文档形式,而不是阻止不良事件发生的东西。