2

IComparable を実装する汎用クラス「MinHeap(T)」を開発しようとしました。ジェネリックが「int」または別のクラス「コード」の場合、正常に機能します。さらに進んで、T にジェネリック クラス "Node(Code)" を使用すると、以下のエラーが発生します。

私はおそらく初心者で、IComparable と IComparable(T) の微妙な違いを理解していません。誰かがアイデアを持っていますか?助けてくれてありがとう、LJ

public class MinHeap<T> where T : IComparable
{
...
}
public class Node<T> where T : IComparable
{
    T data
...
    public int CompareTo(object obj)
    {
        Node<T> otherNode = obj as Node<T>;
        return this.data.CompareTo(otherNode.data);
    }
...
}
public class Code : IComparable
{
    public int freq;
...
    public int CompareTo(object obj)
    {
        Code otherCode = obj as Code;
        return this.freq.CompareTo(otherCode.freq);
    }
}
static void Main(string[] args)
{
    MinHeap<int> hInt = new MaxHeap<int>(heapSeed); // works fine
    MinHeap<Code> hCode = new MinHeap<Code>(codeList); // works fine
...
    Node<Code>[] nodeCodeList = new Node<Code>[freqList.Length]; // ok        
    MinHeap<Node<Code>> h = new MinHeap<Node<Code>>(nodeCodeList); // Error
...
}

エラーメッセージ:

エラー 2 型 'Algorithms.Node(Algorithms.Code)' は、ジェネリック型またはメソッド 'Algorithms.MinHeap(T)' の型パラメーター 'T' として使用できません。「Algorithms.Node(Algorithms.Code)」から「System.IComparable」への暗黙的な参照変換はありません。

4

3 に答える 3

2

型を実装する必要がないように、ジェネリック クラスを定義した方がよいでしょうIComparable<T>。これが、.NET ジェネリック クラスの実装方法です。型のデフォルトの比較を使用するか、IComparer<T>渡した を使用します。たとえば、SortedList次のコンストラクタがあります(特に):

SortedList<TKey, TValue>(); // uses default comparer for TKey
SortedList<TKey, TValue>(IComparer<T> comparer); // uses supplied comparer

実装するのは簡単です:

public class MinHeap<T>
{
    private IComparer<T> _comparer;

    public MinHeap<T>(IComparer<T> comp)
    {
        _comparer = comp;
    }

    public MinHeap<T>()
        : this(Comparer<T>.Default)
    {
    }
}

そうすれば、クライアントは を使用MinHeap<T>して、実装していないクラスのインスタンスを保持できますIComparable<T>

比較を行うときは、_comparer.Compare(item1, item2)

別の注意として、ヒープがノードを要求する必要は特にありません。バイナリ ヒープを配列に実装できます。たとえば、ジェネリック BinaryHeap クラスを参照してください。

于 2013-07-30T13:27:39.577 に答える
2

このクラス Node<T>は を実装していませんIComparable。の型に対する制約があるだけですT

デコレータパターンを実装しようとしたようです。インターフェイスも実装してから、メソッドを装飾されたオブジェクトにマップします。

于 2013-07-30T13:02:02.860 に答える