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