Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Языки программирования. Практический сравнитель...doc
Скачиваний:
54
Добавлен:
09.09.2019
Размер:
2.68 Mб
Скачать

Динамический полиморфизм в языке Ada 95 имеет место, когда фактиче­ский параметр относится к cw-типу, а формальный параметр относится к конкретному типу.

Реализации диспетчеризации во время выполнения в языках Ada 95 и C++ похожи, тогда как условия для диспетчеризации совершенно разные:

• В C++ подпрограмма должна быть объявлена виртуальной, чтобы мож­но было выполнить диспетчеризацию. Все косвенные вызовы виртуаль­ной подпрограммы диспетчеризуются.

• В языке Ada 95 любая унаследованная подпрограмма может быть замеще­на и неявно становится диспетчеризуемой. Диспетчеризация выполняется только в случае необходимости, если этого требует конкретный вызов.

Основное преимущество подхода, принятого в языке Ada, состоит в том, что не нужно заранее определять, должен ли использоваться динамический поли­морфизм. Это означает, что не существует различий в семантике между вызовом виртуальной и невиртуальной подпрограммы. Предположим, что Airplane_Data был определен как теговый, но никакие порождения сделаны не были. В этом случае вся система построена так, что в ней все вызовы разрешены статически. Позже, если будут объявлены производные типы, они смогут использовать дис­петчеризацию без изменения или перекомпиляции существующего кода.

14.6. Упражнения

1. Метод разработки программного обеспечения, называемый нисходящим программированием, пропагандирует написание программы в терминах операций высокого уровня абстракции и последующей постепенной детализации операций, пока не будет достигнут уровень операторов язы­ка программирования. Сравните этот метод с объектно-ориентирован­ным программированием.

2. Объявили бы вы Aircraft_Data абстрактным типом данных или сделали поля класса открытыми?

3. Проверьте, что можно наследовать из класса в языке C++ или из тегового пакета в языке Ada 95 без перекомпиляции существующего кода.

4. Опишите неоднородную очередь на языке Ada 95: объявите теговый тип Item, определите очередь в терминах Item, а затем породите из Item производные типы — булев, целочисленный и символьный.

5. Опишите неоднородную очередь на языке C++.

6. Проверьте, что в языке C++ диспетчеризация имеет место для ссылочного, но не для обычного параметра.

7. В языке Ada 95 теговый тип может быть расширен приватными добавлениями:

with Airplane_Package; use Airplane_Package;

package SST_Package is

type SST_Data is new Airplane_Data with private;

procedure Set_Speed(A: in out SST_Data; I: in Integer);

function Get_Speed(A: SST_Data) return Integer;

private

end SST_Package;

Каковы преимущества и недостатки такого расширения?

8. Изучите машинные команды, сгенерированные компилятором Ada 95 или C++ для динамического полиморфизма.

Глава 15

Еще об

объектно-ориентированном

программировании

В этой главе мы рассмотрим еще несколько конструкций, которые существу­ют в объектно-ориентированных языках. Это не просто дополнительные удобства — это существенные конструкции, которые необходимо освоить, ес­ли вы хотите стать компетентными в объектно-ориентированных методах программирования. Данный обзор не является исчерпывающим; детали мож­но уточнить в учебниках по языкам программирования. Глава разделена на шесть разделов: