Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Uml Book (Rus).doc
Скачиваний:
15
Добавлен:
11.08.2019
Размер:
58.74 Mб
Скачать

Обобщения

Обобщением называется отношение между общей сущностью, которую называ­ют суперклассом или родителем, и более специализированной ее разновидностью, называемой подклассом или потомком (см. главу 5). Например, общий класс Window (Окно) можно специализировать, создав класс-потомок MultiPaneWindoW (МногоФорточноеОкно). Благодаря отношениям обобщения от потомка к роди­телю MultiPaneWindow унаследует структуру и поведение своего родителя -Window. У потомка могут появиться новые элементы структуры или поведения,

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

Как правило, достаточно одиночного наследования, когда у класса имеется все­го один родитель. Но иногда используют и множественное наследование, которое тоже можно моделировать на языке UML. Так, на рис. 10.2 показано множество классов, взятых из финансового приложения. Как видите, класс Активы имеет трех потомков: БанковскийСчет, Недвижимость и ЦенныеБумаги. У первого и последнего из них имеются собственные потомки. Например, Акция и Облига­ция являются потомками класса ЦенныеБумаги.

Два класса (БанковскийСчет и Недвижимость) наследуют от нескольких ро­дителей. Класс Недвижимость, например, является потомком классов Активы и ОбъектСтрахования, а класс БанковскийСчет - потомком классов ОбъектНачисленияПроцентов,ОбъектСтрахования и Активы.

Классы-родители (в данном случае ОбъектНачисленияПроцентов и Объ­ектСтрахования) называются смешивающими (mixins), поскольку порождают потомков не самостоятельно, а совместно с другими классами (Активы).

Примечание С множественным наследованием следует обращаться осторож­но. Если структура или поведение нескольких предков перекрыва­ются, у вас могут возникнуть проблемы. Как правило, множествен­ное наследование можно заменить делегированием, когда потомок наследует только от одного родителя, а затем использует агреги­рование для получения структуры и поведения от второстепенных предков. Недостатком такого подхода является потеря семанти­ки замещаемости с второстепенными предками.

Для большинства отношений наследования, которые вам встретятся, будет дос­таточно простых отношений обобщения без каких-либо дополнений (механизмы расширения UML рассмотрены в главе 6). Но если вы хотите специфицировать

смысловые нюансы, можно воспользоваться одним стереотипом и четырьмя огра­ничениями, определенными в языке UML для применения совместно с обобще­ниями (см. «Приложение В»).

Во-первых, имеется один стереотип.

  • implementation - показывает, что потомок наследует реализацию родите­ля, но не открывает и не поддерживает его интерфейсы, тем самым делая не­возможным замещение. Этот стереотип можно использовать для моделиро­вания закрытого наследования, поддерживаемого в языке C++.

Кроме стереотипа, к отношениям обобщения применимы четыре стандартных ограничения. Вот первая пара:

  • complete - показывает, что в модели определены все потомки в данном о -ношении обобщения (хотя некоторые могут быть скрыты на диаграмме) и на­личие дополнительных потомков не допускается;

  • incomplete - показывает, что определены не все потомки в данном отно­шении (считая и тех, которые скрыты на диаграмме) и допускается включе­ние дополнительных.

Если явно не оговорено противное, то можно считать, что на любой диаграмме показана лишь часть иерархии наследования, то есть некоторые ветви скрыты. Однако сокрытие ветвей не означает неполноту модели. Поэтому, если вы хотите яв­ным образом показать, что полностью определили иерархию в модели (хотя и не показали ее целиком на диаграмме), применяйте ограничение complete. Равным образом с помощью ограничения incomplete можно явно показать, что вы не специфицировали иерархию наследования целиком (хотя на диаграмме показаны все элементы модели).

Вторая пара ограничений:

  • disjoint - показывает, что объекты класса родителя могут иметь не более одного потомка на правах типа (см. главу 11);

  • overlapping - показывает, что объекты класса родителя могут иметь более одного потомка на правах типа.

Эти ограничения применимы только в контексте множественного наследования, если вы хотите различить статическую (disjoint) и динамическую (overlapping) классификации.

Примечание Чаще всего объект имеет один постоянный тип во время выполне­ния программы, - это называется статической классификацией. Если тип объекта может меняться, то имеет место динамичес­кая классификация. Моделирование последней является непростой задачей, однако в UML можно использовать комбинацию множе­ственного наследования с типами, чтобы показать потенциальные типы объекта, и взаимодействиями (см. главу 15),чтобы показать изменение типа объекта во время работы программы.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]