![](/img/trans.png)
[英]C# How to inherit class from abstract generic class with generic class as type parameter
[英]How to inherit a generic class from a nested generic class in C#
我正在做作業,陷入泛型和繼承的一些問題。
我有一個通用的紅黑樹類,因為它是紅黑樹,其鍵應該是可比較的,所以
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/
您得到的錯誤如下:
編譯錯誤(第xx行,是):類型'Program.Interval <T>'不能用作通用類型或方法'Program.RedBlackTree <T>'中的類型參數'T'。 從'Program.Interval <T>'到'System.IComparable <Program.Interval <T >>'沒有隱式引用轉換。
您需要將錯誤拆開,並考慮它在告訴您什么。 在這種情況下,您需要聲明IntervalTree
繼承自RedBlackTree<Interval<T>>
。 但是,您已指定RedBlackTree
的通用T
類型必須實現IComparable<T>
。 如果您為Interval
實現IComparable
,該錯誤將消失。 Interval
必須實現用於收縮RedBlackTree
的接口。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.