ВУЗ:
Составители:
Рубрика:
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
Страницы
- « первая
- ‹ предыдущая
- …
- 121
- 122
- 123
- 124
- 125
- …
- следующая ›
- последняя »
