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

UptoLike

123
Этот вариант решения проблемы может привести к ошибкам времени
выполнения программы. Класс, который используется в качестве T и объект
которого преобразуется в свойстве к IComparable, обязан реализовывать
этот интерфейс. Если это требование не выполняется, при преобразовании
возникнет ошибка.
Более корректно эта проблема решается с помощью введения
уточнений (constraints) в обобщения. Задать уточнение можно с помощью
ключевого слова where сразу после списка параметров типа. Например,
уточнение для обобщения Set о том, что обобщенный тип должен
реализовывать интерфейс IComparable, записывается так:
// обобщенный класс «Множество» с уточнением о том,
// что элементы множества можно сравнивать
class Set<T> where T:IComparable
{
. . .
// свойство для получения
// минимального элемента в множестве
public T Min
{
get
{
if (elements.Length == 0)
throw new Exception("Пустое множество");
T min = elements[0];
foreach (T el in elements)
if (el.CompareTo(min)<0)
min = el;
return min;
}
}
}
Заметим, что в этом случае указывать преобразование типа не
требуется, поскольку уже на этапе компиляции будет отслеживаться, что
аргумент типа, применяемого вместо обобщенного, раскрывает
соответствующий интерфейс.
Для одного и того же обобщенного типа можно задать несколько
уточнений они перечисляются через запятую. В случае, когда обобщенных
типов несколько, уточнения для каждого из них задаются с помощью
собственной конструкции where:
      Этот вариант решения проблемы может привести к ошибкам времени
выполнения программы. Класс, который используется в качестве T и объект
которого преобразуется в свойстве к IComparable, обязан реализовывать
этот интерфейс. Если это требование не выполняется, при преобразовании
возникнет ошибка.
      Более корректно эта проблема решается с помощью введения
уточнений (constraints) в обобщения. Задать уточнение можно с помощью
ключевого слова where сразу после списка параметров типа. Например,
уточнение для обобщения Set о том, что обобщенный тип должен
реализовывать интерфейс IComparable, записывается так:

   // обобщенный класс «Множество» с уточнением о том,
   // что элементы множества можно сравнивать
   class Set where T:IComparable
   {
          .      .    .
        // свойство для получения
        // минимального элемента в множестве
        public T Min
        {
            get
            {
                if (elements.Length == 0)
                   throw new Exception("Пустое множество");
                T min = elements[0];
                foreach (T el in elements)
                   if (el.CompareTo(min)<0)
                      min = el;
                   return min;
            }
        }
     }

     Заметим, что в этом случае указывать преобразование типа не
требуется, поскольку уже на этапе компиляции будет отслеживаться, что
аргумент типа, применяемого вместо обобщенного, раскрывает
соответствующий интерфейс.
     Для одного и того же обобщенного типа можно задать несколько
уточнений – они перечисляются через запятую. В случае, когда обобщенных
типов несколько, уточнения для каждого из них задаются с помощью
собственной конструкции where:


                                                                    123