如何从C#中的嵌套泛型类继承泛型类

Chl*_*rie 1 c# generics inheritance nested-generics

我正在完成我的家庭作业,并陷入了一些泛型和继承问题.

我有一个通用的红黑树类,因为它是红黑树,它的键应该是可比的,所以

public class RedBlackTree<T> where T : IComparable<T>
Run Code Online (Sandbox Code Playgroud)

然后我想要另一个类,比方说,一个间隔树,它是红黑树的增强版本.所以我定义了这样的间隔:

public class Interval<T> : IComparable where T : IComparable<T>
Run Code Online (Sandbox Code Playgroud)

并且由于区间树确实是一个红色黑色的树,其间隔为其键,但只是使用更具体的方法,我定义了这样的类:

public class IntervalTree<T> : RedBlackTree<Interval<T>> where T : IComparable<T>
Run Code Online (Sandbox Code Playgroud)

但它不会让我这样做,它说"不能隐含地转换Interval<T>System.IComparable<Interval<T>>",但我也写不出类似的东西where Interval<T> : IComparable<Interval<T>>.

我如何在C#中执行此类操作,或者如果在C#中无法执行此继承,我应该使用哪些其他模板?

Eri*_*ert 6

让我们分开吧.我们将停止使用T来解决所有问题,因为这会让人感到困惑.

class RedBlackTree<RBTValue> where RBTValue : IComparable<RBTValue>
Run Code Online (Sandbox Code Playgroud)

好的,所以用于构建的每个RBTValue RedBlackTree<>必须是一个IComparable<RBTValue>.

你想说

 RedBlackTree<Interval<T>>
Run Code Online (Sandbox Code Playgroud)

T某些人来说.那我们知道什么? Interval<T>正在被使用RBTValue,因此Interval<T>必须被人知道IComparable<Interval<T>>.

因此Interval<>需要的定义是:

class Interval<IValue> : IComparable<Interval<IValue>>
Run Code Online (Sandbox Code Playgroud)

现在,还有什么IValue需要的情况IComparable<IValue>呢?如果是,那么我们需要一个约束:

class Interval<IValue> : IComparable<Interval<IValue>> 
where IValue : IComparable<IValue>
Run Code Online (Sandbox Code Playgroud)

确保这一点很清楚.这是两件事,(1)间隔与另一个间隔相当,(2)间隔中的值与其他值相当.

现在我们希望定义一个区间树.

class IntervalTree<ITValue> : RedBlackTree<Interval<ITValue>>
where ITValue : IComparable<ITValue>
Run Code Online (Sandbox Code Playgroud)

这满足了我们的需求吗? Interval<IValue>要求IValue实施IComparable<IValue>. 通过约束ITValue实现IComparable<ITValue>,因此满足要求.

RedBlackTree<RBTValue>要求RBTValueIComparable<RBTValue>. Interval<ITValue>实现IComparable<Interval<ITValue>>,所以这也很好,我们都准备好了.

这就是说:您可以考虑IntervalTree<>使用RBT作为成员而不是基类来实现.有没有一个案例,你将用红黑树多态地处理间隔树?如果没有,则无需在公共表面中公开实现细节.

最后,这些类型可能会变得非常混乱.关于如何滥用这种模式的更多想法,请参阅

https://blogs.msdn.microsoft.com/ericlippert/2011/02/03/curiouser-and-curiouser/