Глава 12.
Обобщения
Разработчикам хорошо известны достоинства объектно-ориентированного про-
граммирования. Одно из ключевых преимуществ — возможность многократного
использования кода за счет создания производных классов, наследующих все воз-
можности базового класса. В производном классе можно просто переопределить
виртуальные методы или добавить новые методы, чтобы изменить унаследованные
от базового класса характеристики для решения новых задач.
Обобщения
(generics) —
еще один механизм, поддерживаемый средой CLR и языками программирования
для другой разновидности многократного использования кода — а именно много-
кратного использования алгоритмов.
По сути, разработчик описывает алгоритм, например, сортировки, поиска, заме-
ны, сравнения или преобразования, но не указывает типы данных, с которыми тот
работает, что позволяет применять алгоритм к объектам разных типов. Применяя
готовый алгоритм, другой разработчик должен указать конкретные типы данных,
например для алгоритма сортировки —
Int32
,
String
и т. д., а для алгоритма срав-
нения —
DateTime
,
Version
и т. д.
Большинство алгоритмов инкапсулировано в типе. CLR поддерживает создание
как обобщенных ссылочных, так и обобщенных значимых типов, однако обобщен-
ные перечислимые типы не поддерживаются. Кроме того, CLR позволяет создавать
обобщенные интерфейсы и делегатов. Иногда полезный алгоритм инкапсулирован
в одном методе, поэтому CLR поддерживает создание обобщенных методов, опреде-
ленных в ссылочном типе, в значимом типе или в интерфейсе.
В частности, в библиотеке FCL определен обобщенный алгоритм управления
списками, работающий с набором объектов. Тип объектов в обобщенном алгорит-
ме не указан. Разработчик, который хочет использовать такой алгоритм, должен
указать конкретный тип данных.
FCL-класс, инкапсулирующий обобщенный алгоритм управления списками, на-
зывается
List
и определен в пространстве имен
System.Collections.Generic
.
Исходный текст определения этого класса выглядит следующим образом (приво-
дится с сокращениями):
[Serializable]
public class List : IList, ICollection, IEnumerable,
IList, ICollection, IEnumerable {
public List();
public void Add(T item);
public Int32 BinarySearch(T item);
public void Clear();
303
Обобщения
public Boolean Contains(T item);
public Int32 IndexOf(T item);
public Boolean Remove(T item);
public void Sort();
public void Sort(IComparer comparer);
public void Sort(Comparison comparison);
public T[] ToArray();
public Int32 Count { get; }
public T this[Int32 index] { get; set; }
}
Символами
сразу после имени класса автор обобщенного класса
List
указал,
что класс работает с неопределенным типом данных. При определении обобщенного
типа или метода переменные, указанные вместо типа (например,
T
), называются
параметрами типа
(type parameters).
T
— это имя переменной, которое применяется
в исходном тексте во всех местах, где используется соответствующий тип данных.
Например, в определении класса
List
переменная
T
служит параметром (метод
Add
принимает параметр типа
T)
и возвращаемым значением (метод
ToArray
воз-
вращает одномерный массив типа
T
) метода. Другой пример — метод-индексатор
(в C# он называется
this
). У индексатора есть метод доступа
get
, возвращающий
значение типа
T
, и метод доступа
set
, получающий параметр типа
T
. Переменную
T
можно использовать в любом месте, где должен указываться тип данных — а значит,
и при определении локальных переменных внутри метода или полей внутри типа.
Do'stlaringiz bilan baham: |