2012-02-01 6 views
6

私は非常にジェネリックスに新しく、簡単なクラスを書くことを試みています。このクラスは汎用的ですが、文字列メンバ変数の説明を並べ替えることもできます。Generics and Implementing IComparable

現時点で私は基本クラスを持っていますが、インターフェイスメンバーCompareTo()を実装しようとすると、実装されていないことを示す上部にエラーが表示されます。ここの問題は何ですか?

using System; 

namespace GenericsPracticeConsole.Types 
{ 
    class SortableGenericType<T> : IComparable 
    { 
     private T t; 
     private string stringName; 

     public T name 
     { 
      get { return t; } 
      set { t = value; } 
     } 

     public int CompareTo(SortableGenericType<T> ourObject) 
     { 
      return stringName.CompareTo(ourObject.stringName); 
     } 
    } 
} 

答えて

7

を実装しています。 IComparableは、インスタンスを任意のオブジェクトと比較する必要がある古いもの(ジェネリックより前のもの)です。 IComparable<U>では、インスタンスとUのインスタンスを比較する必要があります。

class SortableGenericType<T> : IComparable<SortableGenericType<T>> 
{ 
    // 
} 

あなたもIComparableを実装する場合:あなたのクラスは、コレクションだった場合

class SortableGenericType<T> : IComparable, IComparable<SortableGenericType<T>> 
    { 
     private string stringName; 
     public T name { get; set; } 

     public int CompareTo(SortableGenericType<T> ourObject) 
     { 
     //I forgot to add this statement: 
     if(ourObject == null) 
      return -1; 
     return stringName.CompareTo(ourObject.stringName); 
     } 

     public int CompareTo(object obj) 
     { 
     if (obj.GetType() != GetType()) 
      return -1; 
     return CompareTo(obj as SortableGenericType<T>); 
     } 
    } 

をあなたはstringNameフィールド上SortableGenericTypeのインスタンスを比較します、これはあなたが何をすべきかであることを宣言したい場合それはタイプTのアイテムを保持する予定であり、注文可能なアイテムが必要です(これはあなたが求めるものではありませんが、最も一般的なシナリオです)。TIComparable<T>です。

class SomeCollection<T> where T : IComparable<T> 
    { 
     private List<T> items; 

     private void Sort() 
     { 
     // 
     T item1; 
     T item2; 
     if(item1.CompareTo(item2) < 0) 
     { 
      //bla bla 
     } 
     } 
    } 
+0

私は 'if(obj.GetType()!= GetType())は-1を返します。'、これはあなたの比較がもはや反対称性でも再帰性でもないためです。 – porges

+0

真。しかし、私はそのような場合に私が何をすべきかを知りません。あなたの提案は何ですか? –

+0

2番目のCompareTo関数では、次の行を使用します。return CompareTo(obj as SortableGenericType );この行は、行の現在の項目を実際に参照せずに渡されたオブジェクトと現在のオブジェクトを暗黙的に比較しますか? – CSharpened

5

IComparableは、方法public int CompareTo(object obj)を定義します。パラメータタイプは、ご自分のタイプではなく、objectです。だからあなたは実際にインターフェイスを実装していないのです。あなたがする必要がどのような

2つのインターフェイスIComparableIComparable<U>がありIComparable<SortableGenericType<T>>

+0

パーフェクト。どうもありがとう。私は自分のタイプがそれ自身の目的であったので、それをするのは大丈夫だと思った。説明してくれてありがとう。 – CSharpened

+1

タイプはオブジェクトですが、特定のオブジェクトです。 IComparableを使用すると、特定の種類だけでなく、オブジェクトをANYオブジェクトと比較することができます。 –