Языки программирования. Практический сравнительный анализ


Языки программирования. Практический сравнительный анализ - стр. 218


Статическими параметрами заготовок пакетов и процедур (РОДОВЫХ СЕГМЕНТОВ) могут поэтому быть и типы, и процедуры. Определяя родовой сегмент, можно ввести абстракцию, пригодную для использования в различных конкретных контекстах.

Например, в нашем пакете "очередь" весьма конкретный тип "клиент" явно не соответствует степени общности пакета в целом. Можно создать существенно более мощную абстракцию, переписав спецификацию этого пакета следующим образом.

      generic 

      type клиент is private

      package очередь is

            procedure в_очередь (х: in клиент);

            procedure из_очереди (х: out клиент);

            function есть_клиенты return BOOLEAN;

      end очередь;

Тело пакета можно оставить без изменений. Теперь в нашем распоряжении родовой пакет с родовым параметром "клиент". Указывать (категорию и некоторые другие характеристики) родовых параметров (в данном случае private), нужно для контроля за использованием параметра внутри родового сегмента. В нашем случае, например, внутри этого сегмента недопустимы какие-либо операции с объектами типа "клиент", кроме предопределенных для всех приватных типов. С другой стороны, в качестве типов-аргументов в данном случае допустимы любые типы (кроме ограниченных). Таким образом, спецификация private относится скорее к внутренности родового сегмента, чем к контексту его использования. В общем случае в качестве спецификации родового параметра можно указывать категории перечисляемых типов, целых, вещественных, ссылочных, регулярных, но не комбинированных (иначе пришлось бы в родовом сегменте фиксировать названия и типы полей; кстати, чем это плохо?).

Итак, абстракцию мы создали. А как с конкретизацией? Теперь нельзя непосредственно использовать пакет "очередь" с помощью указателя пакета, пока не задан конкретный тип-аргумент. Родовой пакет "очередь" - это только заготовка. Ее можно использовать при объявлении "настоящего" пакета, скажем, "добрая-очередь", если предварительно объявлен тип "добрый-клиент".




- Начало -  - Назад -  - Вперед -