Обобщения и реализации 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);
}
}
}
2 ответа
Есть два интерфейса 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
}
}
}
IComparable определяет метод public int CompareTo(object obj)
, Обратите внимание на тип параметра - это object
, не ваш собственный тип. Вот почему вы на самом деле не реализуете интерфейс.
Что вам нужно сделать, это реализовать IComparable<SortableGenericType<T>>