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

15.6. Методы динамического полиморфизма

Мы заключаем эту главу подведением итогов по динамическому полимор­физму в языках для объектно-ориентированного программирования.

Smalltalk. Каждый вызов подпрограммы требует динамической диспетче­ризации, которая включает поиск по иерархии наследования, пока под­программа не будет найдена.

Eiftel. Каждый вызов подпрограммы диспетчеризуется динамически (если оптимизация не привела к статическому связыванию). В отличие от язы­ка Smalltalk, возможные замещения известны во время компиляции, по­этому диспетчеризация имеет фиксированные издержки, вносимые таб­лицей переходов.

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

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

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

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

1. Реализуйте пакеты на языке Ada 95 и классы на языке C++ для работы с множествами.

2. Может ли абстрактный тип в языке Ada 95 или абстрактный класс в язы­ке C++ иметь компоненты-данные? Если так, для чего они могли бы ис­пользоваться?

type Item is abstract tagged

Ada

record

I: Integer;

end record;

3. Напишите программу для неоднородной очереди, основываясь на абст­рактном классе.

4. Реализуйте пакеты/классы для множеств с родовым типом элемента, а не только для целочисленных элементов.

5. Подробно изучите множественное наследование в языке Eiffel и сравни­те его с множественным наследованием в языке C++.

6. Стандартный пример множественного наследования в языке Eiffel -спи­сок фиксированного размера, реализованный с помощью наследова­ния, как от списка, так и от массива. Как бы вы написали такие ADT (аб­страктные типы данных) на языке Ada 95, в котором нет множественно­го наследования?

7. Чем опасно определение защищенных (protected) данных в языке C++? Относится ли это также к пакетам-детям в языке Ada 95?

  1. Изучите структуру стандартной библиотеки в языке Ada 95, в котором широко используются пакеты-дети. Сравните ее со структурой стандар­тных классов ввода-вывода в языке C++.

9. Изучите пакет Finalization в языке Ada 95, который может использовать­ся для написания конструкторов и деструкторов. Сравните его с конст­рукциями языка C++.

10. Какова связь между операторами присваивания и конструкторами/де структорами?

11. Дайте примеры использования CW-объектов.