Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
45
Добавлен:
23.03.2015
Размер:
884 Кб
Скачать

148 Глава 7

Рис. 7.4. Очереди ql и q2 не используют совместно одну и ту же очередь.

а совместное использование все равно правильно бы paбo^aлo.

Часто бывает полезным включить в "тип некоторую функцию копирования, например функцию q_copy с определением, приве­денным в гл. 4. Функции копирования должны обеспечивать пол­ную неразделяемую копию аргументов. Они могут быть исполь­зованы всегда, когда мы хотим выполнить присвоение обычным семантическим правилом языка Паскаль. Например, мы могли бы написать ql: = q_copy (q2), а не ql: = q2. На рис. 7.4 показано отсутствие совместного использования в том случае, когда оче­реди ql присваивается значение функции q.copy (q2). Надо иметь в виду, однако, что эти функции копирования не будут вызываться компиляторами как часть неявного присваивания, например, при обращении по значению.

И наконец, отметим, что наш метод не препятствует тому, чтобы программы получали доступ к представлению вне реали­зации некоторого типа. По нашему соглашению мы просто счи­таем такой доступ не по правилам.

7.3. Полиморфные абстракции

Параметры типа языка CLU позволяют нам построить поли­морфные абстракции, т. е. абстракции, которые могут быть ис­пользованы для объектов различного типа, В языке Паскаль имеется некоторый встроенный полиморфизм. Генератор типа массивов, например, может быть использован для объявления массивов с различными границами и элементами различных ти­пов. Однако в языке Паскаль почти не обеспечивается определен­ный пользователем полиморфизм. Конечно, это не остановит нас перед проектированием полиморфных абстракций. Специфика­ция таких абстракций достаточно очевидна. Мы используем син­таксис, аналогичный тому, который использовался для специфи-

Использование. языка Паскаль

queue = data type retype: type] is q [etype]_new, q [etype]Jsempty, q [etype]_append, q [etype]_remiirst, q [etype].destroy

Описание

Очереди используются для хранения значений типа данных etype. Эле­менты могут извлекаться из очереди или удаляться из нее только методом обрат­ного магазинного типа («первым пришел — первым обслужен»).

procedure q ietype]_append (q: queue [etype]; e; etype) modifies q efiects Добавляет элемент e в конец очереди q.

end queue Рис. 7.5. Частичная спецификация параметрической счереди.

кации параметрических абстракций при реализации на языке CLU. Пример параметрической очереди приведен па рис. 7.5.

Поскольку язык Паскаль не обеспечивает реализацию пара­метрических абстракций, мы опять полагаемся па соглашение по программированию. Реализация параметрической очереди может выглядеть совсем как реализация inna данных intqueue. Объяв­ление типа представления приводится на рис. 7,6.

type

queue [etypeJ == I queue [etype ]_rep; queue [etype ]_rep == ]quew [etype]_eleiT]; queue [etype ]_e!em == record val: etype; next: queue [etype ]_rep; end;

Рис.. 7.6. Тип представления для реализации типа queue [ etype].

Эти объявления не верны в смысле языка Паскаль, поскольку они содержат такие неверные идентификаторы, как queue letype!. В реализацию этих операций мы вводим также синтаксические ошибки. Эти синтаксические ошибки предотвращают оттого, чтобы программисты случайно не использовали нереализованные пара­метрические абстракции. Реализация операций аналогична реали­зации, приведенной на рис. 7.2, за исключением того, что пре­фикс q заменяем на префикс queue [etype!, а идентификаторы intqueue и integer—соответственно на queue letype] и etype. Реализация операции q letypeLappend приведена на рис. 7.7.

Прежде чем использовать в программе реализацию типа дан­ных queue [etype], мы должны использовать редактор текстсв, чтобы заменить каждое вхождение текста queue [etype] на неко-чорый удобный незапрещенный идентификатор, например на intq. Кроме того, надо заменить все оставшиеся вхождения иден-тификачора etype на некоторый уже известный тип, например

Соседние файлы в папке POSIBNIK