19.4. Создание и использование обобщенных интерфейсов
Аналогично обобщенным классам создаются и используются обобщенные интерфейсы.
interface IDictionary
{
V Translate(K value);
K Translate(V value);
}
Лист. 10.9
Обычно программисту нет необходимости создавать собственные интерфейсы. В большинстве случаев нужно лишь реализовывать стандартные интерфейсы в собственных классах. Это объясняется тем, что интерфейсы – это средство стандартизации, а создание собственных интерфейсов к стандартизации не ведет. Конечно, в большом проекте или при создании собственных библиотек собственные обобщенные интерфейсы могут понадобиться, но потребность в них возникает редко.
19.5. Создание и использование обобщенных делегатов
Совершенно аналогично обобщенным функциям можно создавать и инициализировать обобщенные делегаты. Определим для примера простой делегат, принимающий один параметр обобщенного типа T и возвращающий пустое значение.
public delegate void Del(T item);
Лист. 10.8
Теперь определим метод, имеющий сигнатуру, входящую во множество покрываемых обобщенным делегатом сигнатур.
static void Notify(int i)
{
Console.WriteLine(" {0} ", i);
}
Лист. 10.9
Определим теперь метод Main(), связывающий метод Notify с делегатом Del и вызывающий его.
static void Main(string[] args)
{
Del d1 = new Del(Notify);
Del d2 = Notify;
d1(100000);
}
Лист. 10.10
Вывод программы:
100000
Вывод. 10.3
19.6. Ограничения. Ключевое слово where
Как бы разработчикам того не хотелось один и тот же код обычно нельзя обобщить на все случаи жизни. Почти всегда параметр типа должен соответствовать некоторым требованиям, например, реализовывать некоторый интерфейс или быть значимым, ссылочным или числовым типом. Для наложения необходимых ограничений используется ключевое слово where. Оно ставиться сразу за именем определяемого класса, а за ним идут ограниваемые параметры и двоеточие, за которым следует список ограничений.
class EmployeeList where T : class, Employee, IEmployee, System.IComparable, new()
{
// ...
}
Лист. 10.11
Здесь параметр T должен быть ссылочным типом, производным от класса Employee, реализующим интерфейсы IEmployee, System.IComparable и имеющим конструктор по умолчанию.
Do'stlaringiz bilan baham: |