Обобщения и реализации интерфейса 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 } } }