Опубликован: 17.10.2005 | Доступ: свободный | Студентов: 7956 / 285 | Оценка: 4.38 / 4.10 | Длительность: 41:16:00
ISBN: 978-5-7502-0255-3
Специальности: Программист
Лекция 15:

Множественное наследование

Ключевые концепции

  • Подход к конструированию ПО, подобный конструированию из кубиков, требует возможности объединения нескольких абстракций в одну. Это достигается благодаря множественному наследованию.
  • В самых простых и наиболее общих случаях множественного наследования два родителя представляют независимые абстракции.
  • Множественное наследование часто необходимо как для моделирования систем, так и для повседневной разработки ПО, в частности, создания повторно используемых библиотек.
  • Конфликты имен при множественном наследовании должны устраняться переименованием.
  • Переименование позволяет ввести в классе контекстно-адаптированную терминологию.
  • Компоненты следует отделять от их имен. Один и тот же компонент в разных классах может быть известен под разными именами. Класс определяет отображение имен в компоненты.
  • Дублируемое наследование - мощная техника - возникает как результат множественного наследования, при котором один класс становится потомком другого несколькими способами.
  • При дублируемом наследовании компонент общего предка становится одним компонентом, если он наследуется под одним именем, и несколькими независимыми компонентами в противном случае.
  • Конкурирующие версии общего предка при динамическом связывании должна устраняться предложением select.
  • Механизм репликации при дублируемом наследовании не должен дублировать компоненты, включающие родовые параметры.
  • В ОО-среде семантическая перегрузка, поддерживаемая динамическим связыванием, более полезна, чем синтаксическая перегрузка.

Библиографические замечания

Механизм переименования, а также правила дублируемого наследования были разработаны при написании этой книги. Механизм отмены определений предложен Михаэлем Швайцером (Michael Schweitzer), механизм выбора- Джоном Поттером (John Potter).

Пример с выпадающим меню взят из книги [M 1988c].

Упражнения

У15.1 Окна как деревья

Класс WINDOW порожден от TREE [WINDOW]. Поясните суть родового параметра. Покажите, какое новое утверждение появится в связи с этим в инварианте класса.

У15.2 Является ли окно строкой?

Окно содержит ассоциированный с ним текст, представленный атрибутом text типа STRING. Стоит ли отказаться от атрибута и объявить WINDOW наследником класса STRING?

У15.3 Завершение строительства

Завершите проектирование класса WINDOW, показав точно, что необходимо от лежащего в основе механизма управления выводом?

У15.4 Итераторы фигур

При обсуждении COMPOSITE_FIGURE мы говорили о применении итераторов для выполнения операций над составными фигурами. Разработайте соответтсвующие классы итераторов. ( Подсказка: в [M 1994a] приведены классы библиотеки итераторов, которые послужат основой вашей работы.)

У15.5 Связанные стеки

Основываясь на классах STACK и LINKED_LIST, постройте класс LINKED_STACK, описывающий реализацию стека как связного списка.

У15.6 Кольцевые списки и цепи

Объясните, почему LIST нельзя использовать для создания кольцевых списков. ( Подсказка: в этом вам может помочь изучение формальных утверждений, обсуждение которых вы найдете в начале следующей лекции.) Опишите класс CHAIN, который может служить родителем как для LIST, так и для нового класса кольцевых списков CIRCULAR. Обновите класс LIST и, если нужно, его потомков. Дополните структуру класса, обеспечивающую разные варианты реализации кольцевых списков.

У15.7 Деревья

Согласно одной из интерпретаций, дерево - это рекурсивная структура, представляющая собой список деревьев. Замените приведенное в этой лекции описание класса TREE как наследника LINKED_LIST и LINKABLE новым вариантом

class TREE [G] inherit
         LIST [TREE [G]]
feature ...end

Расширьте это описание до полнофункционального класса. Сравните это расширение с тем, что было описано в тексте данной лекции.

У15.8 Каскадные или "шагающие" (walking) меню

Оконные системы вводят понятие меню, реализуемое классом MENU с запросом, возвращающим список элементов, и командами отображения, перехода к следующему элементу и т.д. Меню составлено из элементов, поэтому нам понадобится класс MENU_ENTRY с такими запросами, как parent_menu и operation (операция, выполняемая при выборе элемента) и такими командами, как execute (выполняет операцию operation ).

Среди меню нередко встречаются каскадные, или шагающие меню (walking menu), где выбор элемента приводит к появлению подменю (submenu). На рисунке приведено шагающее меню среды Open Windows, созданной корпорацией Sun:

Выпадающее меню

Рис. 15.25. Выпадающее меню

Предложите описание класса SUBMENU. ( Подсказка: подменю одновременно является меню и элементом меню, чья операция должна отображать подменю.) Можно ли это понятие с легкостью описать в языке без множественного наследования?

У15.9 Плоский precursor (предшественник)

Что должна показывать плоская форма класса при встрече с инструкцией, использующей Precursor?

У15.10 Дублируемое наследование и репликация

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

Александр Шалухо
Александр Шалухо
Анатолий Садков
Анатолий Садков

При заказе pdf документа с сертификатом будет отправлен только сертификат или что-то ещё?