我正在做作业,陷入泛型和继承的一些问题。
我有一个通用的红黑树类,因为它是红黑树,其键应该是可比较的,所以
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>>
现在,是否也需要任何
IValue
是IComparable<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>
要求RBTValue
为IComparable<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/