我正在做作业,并且遇到了一些关于泛型和继承的问题。
我有一个通用的红黑树类,因为它的红黑树的键应该具有可比性,所以
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>
但它不允许我这样做,它说&#34;不能隐含地将Interval<T>
转换为System.IComparable<Interval<T>>
&#34;但我也不能写点where Interval<T> : IComparable<Interval<T>>
。
如何在C#中执行此类操作,或者如果在C#中无法执行此继承,我应该使用哪些其他模板?
答案 0 :(得分:6)
让我们分开吧。我们将停止使用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/
答案 1 :(得分:0)
您收到的错误如下:
编译错误(第xx行,第0行):类型'Program.Interval&lt; T&gt;' 不能在泛型类型或方法中用作类型参数“T” 'Program.RedBlackTree&LT; T&GT;'。没有隐式引用转换 来自'Program.Interval&lt; T&gt;'至 'System.IComparable&LT; Program.Interval&LT; T&GT;&GT;'。
您需要将错误分开并考虑它告诉您的内容。在这种情况下,您声明RedBlackTree<Interval<T>>
继承自T
。但是,您已指定RedBlackTree
的通用IComparable<T>
类型必须实现IComparable
。如果您为Interval
实施Interval
,则错误将消失。 RedBlackTree
必须实现用于限制'titlestring'
的接口。