Объектно-ориентированное программирование на С#. Андрианова А.А - 122 стр.

UptoLike

122
Таким образом, при обращении к типу-параметру в обобщении программист
может использовать только методы, унаследованные от класса object
(Equals(), GetType(), ToString() и др.). Это сильно ограничивает
выбор алгоритмов, которые могут использоваться в методах обобщения.
Например, пусть в обобщение Set требуется добавить метод получения
минимального элемента множества. Код данного метода мог бы выглядеть
следующим образом:
// свойство для получения минимального элемента в множестве
public T Min
{
get
{
if (elements.Length == 0)
throw new Exception("Пустое множество");
T min = elements[0];
foreach (T el in elements)
if (el<min) // Ошибка!
min = el;
return min;
}
}
Ошибка при компилировании этого свойства вызвана тем, что для
класса object не определены операции сравнения объектов данном
случае, операция "<"). Эту ошибку можно исправить, используя в свойстве
операцию преобразования (к типу интерфейса IComparable, в котором
определен метод сравнения CompareTo()).
// свойство для получения минимального элемента в множестве
public T Min
{
get
{
if (elements.Length == 0)
throw new Exception("Пустое множество");
T min = elements[0];
foreach (T el in elements)
// приведение элемента множества к типу IComparable
// и сравнение его с помощью метода CompareTo()
if (((IComparable)el).CompareTo(min)<0)
min = el;
return min;
}
}
Таким образом, при обращении к типу-параметру в обобщении программист
может использовать только методы, унаследованные от класса object
(Equals(), GetType(), ToString() и др.). Это сильно ограничивает
выбор алгоритмов, которые могут использоваться в методах обобщения.
Например, пусть в обобщение Set требуется добавить метод получения
минимального элемента множества. Код данного метода мог бы выглядеть
следующим образом:

      // свойство для получения минимального элемента в множестве
      public T Min
      {
         get
         {
            if (elements.Length == 0)
               throw new Exception("Пустое множество");
            T min = elements[0];
            foreach (T el in elements)
               if (el