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

UptoLike

124
// примеры возможных уточнений
class SomeGeneric<T1, T2, T3>
where T1: IComparable
where T2: SomeGenericClass<T1, T2>, IComparable, new()
where T3: SomeClass, IEnumerable, IComparable
{
. . .
}
В качестве уточнения может использоваться имя класса (при этом
параметр типа должен быть унаследован от этого класса), имя интерфейса
(который должен реализовать параметр типа) или new(). Класс и
интерфейсы могут быть и обобщениями.
Имя класса в уточнении может быть задано только один раз и обязано
быть первым в списке уточнений. Интерфейсы могут задаваться в любом
количестве. Ограничение new() говорит о том, что параметр типа должен
реализовывать public-конструктор, не имеющий параметров, что означает
возможность создания экземпляра соответствующего типа с помощью
оператора new. Ограничение new() должно быть последним в списке
уточнений.
В .NET можно описывать не только обобщенные классы, но и
обобщенные интерфейсы (generic-интерфейсы), обобщенные делегаты
(generic-делегаты), отдельные методы классов (generic-методы).
Обобщенные классы могут быть унаследованы от других классов, в
том числе и от обобщенных. Также они могут реализовывать любое
количество интерфейсов, как обычных, так и generic. Простые классы и
интерфейсы также могут быть унаследованы от generic-классов, но при
этом generic-классы и интерфейсы должны быть закрытыми типами.
Обобщенные классы и интерфейсы не могут быть унаследованы от типов-
параметров.
Приведем несколько примеров:
// Нельзя использовать параметр типа
// в качестве базового типа!
class Extend<V> : V {} // Ошибка!
// Пусть определены обобщенный класс C
// и обобщенный интерфейс I1
class C<U, V> {}
interface I1<V> {}
      // примеры возможных уточнений
      class SomeGeneric
            where T1: IComparable
            where T2: SomeGenericClass, IComparable, new()
            where T3: SomeClass, IEnumerable, IComparable
      {
        .    .    .
      }


      В качестве уточнения может использоваться имя класса (при этом
параметр типа должен быть унаследован от этого класса), имя интерфейса
(который должен реализовать параметр типа) или new(). Класс и
интерфейсы могут быть и обобщениями.
      Имя класса в уточнении может быть задано только один раз и обязано
быть первым в списке уточнений. Интерфейсы могут задаваться в любом
количестве. Ограничение new() говорит о том, что параметр типа должен
реализовывать public-конструктор, не имеющий параметров, что означает
возможность создания экземпляра соответствующего типа с помощью
оператора new. Ограничение new() должно быть последним в списке
уточнений.
      В .NET можно описывать не только обобщенные классы, но и
обобщенные интерфейсы (generic-интерфейсы), обобщенные делегаты
(generic-делегаты), отдельные методы классов (generic-методы).
      Обобщенные классы могут быть унаследованы от других классов, в
том числе и от обобщенных. Также они могут реализовывать любое
количество интерфейсов, как обычных, так и generic. Простые классы и
интерфейсы также могут быть унаследованы от generic-классов, но при
этом generic-классы и интерфейсы должны быть закрытыми типами.
Обобщенные классы и интерфейсы не могут быть унаследованы от типов-
параметров.
      Приведем несколько примеров:

      // Нельзя использовать параметр типа
      // в качестве базового типа!
      class Extend : V {}            // Ошибка!

      // Пусть определены обобщенный класс C
      // и обобщенный интерфейс I1
      class C {}
      interface I1 {}


124