22. Особенности моделирования иерархии классов. Типы отношений между классами.
Кроме внутреннего устройства классов важную роль при разработке проектируемой системы имеют различные отношения между классами, которые также могут быть изображены на диаграмме классов. Совокупность допустимых типов таких отношений строго фиксирована в языке UML и определяется самой семантикой этих отношений. Базовые отношения, изображаемые на диаграммах классов:
- Отношение ассоциации (Association relationship) Отношение ассоциации соответствует наличию произвольного отношения или взаимосвязи между классами.
- Отношение обобщения (Generalization relationship) Применительно к диаграмме классов данное отношение описывает иерархическое строение классов и наследование их свойств и поведения (Наследование)
- Отношение агрегации (Aggregation relationship) Отношение агрегации имеет место между несколькими классами в том случае, если один из классов представляет собой сущность, которая включает в себя в качестве составных частей другие сущности.
- Отношение композиции (Composition relationship) разновидность отношения агрегации, при которой составные части целого имеют такое же время жизни, что и само целое
Каждое из этих отношений имеет собственное графическое представление, которое отражает семантический характер взаимосвязи между объектами соответствующих классов.
При моделировании иерархии классов, верхние уровни занимают общие абстракции, а ниже находятся специализированные классы. Внутри этой иерархии некоторые классы определяют как абстрактные, то есть не имеющие непосредственных экземпляров. В языке UML имя абстрактного класса пишут курсивом. Наоборот, конкретными называются классы, которые могут иметь непосредственные экземпляры.
При моделировании класса часто возникает потребность задать ему свойства, унаследованные от более общих классов и, наоборот, предоставить возможность более специализированным классам наследовать особенности данного. Такая семантика легко обеспечивается для классов средствами UML. Можно определить и такие классы, у которых нет потомков. Они называются листовыми и задаются в UML с помощью свойства leaf (лист), написанного под именем класса. Реже используется возможность задать класс, не имеющий родителей. Такой класс называется корневым и специфицируется с помощью свойства root (узел), записанного под его именем. Если имеется несколько независимых иерархий наследования, то начало каждой удобно обозначать таким способом. Операции могут иметь сходные свойства. Как правило, операции являются полиморфными, – это значит, что в различных местах иерархии классов можно определять операции с одинаковыми сигнатурами. При этом те операции, которые определены в классе–потомке, перекрывают действие тех, что определены в родительских классах. Когда во время исполнения системы поступает какое–то сообщение, операция по его обработке вызывается полиморфно, – иными словами, выбирается та, которая соответствует типу объекта. В UML имена абстрактных операций пишутся курсивом, как и в случае с классами. Не полиморфные операции (листовые) обозначаются при помощи слова leaf. Это означает, что данная операция не может быть перекрыта другой.