我正在做作业,陷入泛型和继承的一些问题。

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

public class RedBlackTree<T> where T : IComparable<T>


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

public class Interval<T> : IComparable where T : IComparable<T>


由于间隔树的确是一棵以间隔为键的红黑树,但是只有更具体的方法,因此我定义了这样的类:

public class IntervalTree<T> : RedBlackTree<Interval<T>> where T : IComparable<T>


但这不会让我这样做,它说“无法将Interval<T>隐式转换为System.IComparable<Interval<T>>”之类的内容,但我也无法编写类似where Interval<T> : IComparable<Interval<T>>的内容。

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

最佳答案

让我们拆开。我们将停止对所有内容使用T,因为这会造成混淆。

class RedBlackTree<RBTValue> where RBTValue : IComparable<RBTValue>


好的,因此用于构造RedBlackTree<>的每个RBTValue必须是一个IComparable<RBTValue>

你想说

 RedBlackTree<Interval<T>>


在某些时候使用T。那我们知道些什么呢? Interval<T>用于RBTValue,因此必须知道Interval<T>IComparable<Interval<T>>

因此,Interval<>的定义必须为:

class Interval<IValue> : IComparable<Interval<IValue>>


现在,是否也需要任何IValueIComparable<IValue>?如果是,那么我们需要一个约束:

class Interval<IValue> : IComparable<Interval<IValue>>
where IValue : IComparable<IValue>


确保清楚。这是说两件事:(1)一个区间可以与另一个区间相比较,以及(2)一个区间中的值可以与其他值相比较。

现在我们希望定义一个间隔树。

class IntervalTree<ITValue> : RedBlackTree<Interval<ITValue>>
where ITValue : IComparable<ITValue>


这是否满足我们的需求? Interval<IValue>要求IValue实现IComparable<IValue>ITValue通过约束实现IComparable<ITValue>,因此可以满足要求。

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

综上所述:您可以考虑使用RBT作为成员而不是基类来实现IntervalTree<>。是否曾经有过您要用红黑树对间隔树进行多态处理的情况?如果不是这样,则无需在公共场合公开实现细节。

最后,这些类型的类型会变得非常混乱。有关如何更可怕地滥用此模式的更多想法,请参见

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

关于c# - 如何从C#中的嵌套泛型类继承泛型类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49703320/

10-10 09:03
查看更多