6

私はジェネリックスに非常に慣れていないので、ジェネリックスになるだけでなく、文字列メンバー変数の説明を並べ替えることができる単純なクラスを作成しようとしています。

現時点では基本クラスがありますが、インターフェイスメンバー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);
        }
    }
}
4

2 に答える 2

7

2つのインターフェイスIComparableとがありますIComparable<U>IComparableインスタンスを任意のオブジェクトと比較する必要がある古いもの(ジェネリックスの前にあります)です。IComparable<U>インスタンスをのインスタンスと比較する必要がありますU。stringNameフィールドでSortableGenericTypeのインスタンスを比較することを宣言する場合は、次のようにする必要があります。

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>);
      }
   }

クラスがタイプのアイテムを保持するコレクションであり、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
         }
      }
   }
于 2012-02-01T10:47:29.480 に答える
5

IComparableはメソッドを定義しますpublic int CompareTo(object obj)。パラメータタイプに注意してくださいobject。これは、独自のタイプではありません。そのため、実際にはインターフェイスを実装していません。

あなたがする必要があるのは実装することですIComparable<SortableGenericType<T>>

于 2012-02-01T10:29:18.873 に答える