Обобщения и реализации IComparable - PullRequest
6 голосов
/ 01 февраля 2012

Я очень новичок в дженериках и пытаюсь написать простой класс, который будет универсальным, но также позволит сортировать некоторые описания в строковой переменной-члене.

В данный момент у меня есть базовый класс, но когда я пытаюсь реализовать интерфейсный член 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);
        }
    }
}

Ответы [ 2 ]

7 голосов
/ 01 февраля 2012

Есть два интерфейса IComparable и IComparable<U>. IComparable - это более старый (предшествующий дженерикам), который требует сравнения экземпляров с произвольными объектами. IComparable<U> требует, чтобы экземпляры сравнивались с экземплярами U. Если вы хотите объявить, что вы будете сравнивать экземпляры SortableGenericType в полях stringName, вам следует сделать следующее:

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, и вам нужно, чтобы эти элементы можно было заказать (это не то, о чем вы спрашиваете, но это наиболее распространенный сценарий), чем вам требуется T быть IComparable<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
         }
      }
   }
5 голосов
/ 01 февраля 2012

IComparable определяет метод public int CompareTo(object obj).Обратите внимание на тип параметра - это object, а не ваш собственный тип.Вот почему вы на самом деле не реализуете интерфейс.

Что вам нужно сделать, это реализовать IComparable<SortableGenericType<T>>

...