Из многих других примеров контейнеров отметим деревья, стеки и массивы. В сравнение со списком
[x]. Списки книг являются, с другой стороны, специальным случаем списков объектов некоторого вида. Из многих других видов отметим списки журналов, списки людей, списки целых чисел. Это горизонтальная размерность на нашем рисунке - размерность универсализации, тема нашего изучения в последующей части этой лекции. Если задать параметр класса, представляющий произвольный тип, то можно не создавать почти идентичные классы, такие как
Отношение между двумя этими механизмами - трудный вопрос для изучающих ОО-концепции. Как рассматривать наследование и параметризацию, как соперников или как соратников, когда целью является построение более гибкого ПО?10.1)
Данная лекция посвящена универсализации, кроме того, мы подробно рассмотрим один из наиболее общих примеров родовых структур: массивы. Заметьте, термины универсальный класс, родовой класс, параметризованный класс являются синонимами. Во всех случаях речь идет о классе с параметрами, задающими некоторый тип (класс).
Необходимость параметризованных классов
Универсализация уже рассматривалась в данной книге, но не применялась для классов. Мы столкнулись с ней при обзоре традиционных подходов к повторному использованию и при изучении математической модели класса - АТД, где была показана необходимость определения параметризированного АТД.
Родовые АТД
Наш работающий пример АТД,
Любые АТД, описывающие контейнеры: множества, списки, матрицы, массивы и многие другие, очевидно, также должны быть родовыми.
Это решение применимо к контейнерам классам, также как к контейнерам АТД.
Проблема
Рассмотрим пример стека, но уже не как АТД, а как класс. Мы знаем, как написать класс
Тип
put (element: INTEGER) is
-- Втолкнуть элемент (в вершину стека).
do ... end
item: INTEGER is
-- Элемент в вершине стека
do ... end
Эти появления типа
Как следствие, придется писать различные классы для каждого сорта стека:
Проблема возникает из-за противоречия двух основных требований, предъявляемых к классам и сформулированных в начале этой книги.
[x]. Надежность: сохранение преимуществ безопасности типов с помощью явного объявления типа.
[x]. Повторное использование: возможность написать один программный элемент, покрывающий многие варианты одного понятия.
Роль типизации
Зачем настаивать на явном объявлении типов (первое из двух требований)? Это часть главного вопроса о типизации, которому в этой книге посвящена отдельная лекция (лекция 17). Но уже сейчас можно указать две основные причины, по которым ОО-программа должна быть статически типизирована.
[x]. Читаемость: явное объявление четко сообщает читателю о том, как предполагается использовать каждый элемент. Это важно как для автора, так и для того, кому нужно понять часть программы, чтобы отладить или расширить ее.
