ПриМеЧание
В.FCL.определены.необобщенные.и.обобщенные.версии.интерфейсов.IComparable,.
ICollection,.IList,.IDictionary.и.некоторых.других .Если.вы.определяете.тип.и.хотите.
реализовать.любой.из.этих.интерфейсов,.обычно.лучше.выбирать.обобщенные.
версии .Необобщенные.версии.оставлены.в.FCL.для.обратной.совместимости.с.ко-
дом,.написанным.до.того,.как.в. NET.Framework.появилась.поддержка.обобщений .
Необобщенные.версии.также.предоставляют.пользователям.механизм.работы.
с.данными.более.универсальным,.но.и.менее.безопасным.образом
Некоторые.обобщенные.интерфейсы.происходят.от.необобщенных.версий,.так.что.
в.классе.приходится.реализовывать.как.обобщенную,.так.и.необобщенную.версии .
Например,.обобщенный.интерфейс.IEnumerable.наследует.от.необобщенного.
интерфейса.IEnumerable .Так.что.если.класс.реализует.IEnumerable,.он.должен.
также.реализовать.IEnumerable
343
Обобщенные.интерфейсы
Иногда,.при.необходимости.интеграции.с.другим.кодом,.приходится.реализовывать.
необобщенный.интерфейс.просто.потому,.что.необобщенной.версии.не.существует .
В.этом.случае,.если.любой.из.интерфейсных.методов.принимает.или.возвращает.
тип.Object,.теряется.безопасность.типов.при.компиляции,.и.значимые.типы.должны.
упаковываться .Можно.в.некоторой.степени.исправить.эту.ситуацию,.действуя.так,.
как.описано.далее.в.разделе.«Совершенствование.безопасности.типов.за.счет.явной.
реализации.интерфейсных.методов»
Третье преимущество обобщенных интерфейсов заключается в том, что класс
может реализовать один интерфейс многократно, просто используя параметры
различного типа. Следующий пример показывает, как это бывает удобно:
using System;
// Этот класс реализует обобщенный интерфейс IComparable дважды
public sealed class Number: IComparable, IComparable {
private Int32 m_val = 5;
// Этот метод реализует метод CompareTo интерфейса IComparable
public Int32 CompareTo(Int32 n) {
return m_val.CompareTo(n);
}
// Этот метод реализует метод CompareTo интерфейса IComparable
public Int32 CompareTo(String s) {
return m_val.CompareTo(Int32.Parse(s));
}
}
public static class Program {
public static void Main() {
Number n = new Number();
// Значение n сравнивается со значением 5 типа Int32
IComparable cInt32 = n;
Int32 result = cInt32.CompareTo(5);
// Значение n сравнивается со значением "5" типа String
IComparable cString = n;
result = cString.CompareTo("5");
}
}
Параметры интерфейса обобщенного типа могут быть также помечены как
контравариантые или ковариантные, что позволяет более гибко использовать
интерфейсы. Подробнее о контравариантности и ковариантности рассказывается
в главе 12.
Do'stlaringiz bilan baham: |