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

时间:2018-04-07 02:42:21

标签: c# generics inheritance nested-generics

我正在做作业,并且遇到了一些关于泛型和继承的问题。

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

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#中无法执行此继承,我应该使用哪些其他模板?

2 个答案:

答案 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>要求RBTValueIComparable<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'的接口。