簡體   English   中英

如何從C#中的嵌套泛型類繼承泛型類

[英]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>要求RBTValueIComparable<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM