Одним из признаков объектно-ориентированного подхода является выполнение одного из общеизвестных аспектов повседневной жизни: если вы знаете что-либо о некоторой категории, то автоматически можете перенести эти знания на другие категории. Если известно, что объект относится к бытовой технике, то уже известно, что он имеет выключатель, имя производителя и номер изделия. Если известно, что объект является животным, то заранее ясно, что оно ест, спит, рождается, перемещается в пространстве. При более детальном анализе можно составить список других атрибутов и операций.
В рамках объектно-ориентированного подхода такое положение вещей называется наследованием. В UML для наследования используется термин обобщение. Один класс (дочерний или подкласс) может наследовать атрибуты и операции другого (родительского класса или суперкласса). Родительский класс является более общим по отношению к дочернему.
В отношении обобщения можно сказать, что ребенок способен заменить родителя. Другими словами, везде, где появляется родитель, может появиться и ребенок, а обратное утверждение неверно.
|
|
Иерархия наследования не ограничивается двумя уровнями: дочерний класс может выступать в роли родительского класса для другого дочернего класса. Класс Млекопитающее является дочерним классом для класса Животное и родительским – для класса Лошадь.
В UML наследование отображается с помощью линии, которая соединяет родительский класс с дочерним. Конец линии, связанный с родительским классом, помечается не закрашенным треугольником, указывающим на родительский класс. Такая связь соответствует отношению – «является видом». Млекопитающее «является видом» животного, лошадь «является видом» млекопитающего. На рис. 39 представлены ранее описанная иерархия наследования и дополнительные классы. Обратите внимание на графическое представление ситуации, когда родительский класс имеет несколько дочерних классов. Такая конструкция позволяет разгрузить диаграмму. Нужно отметить, что UML не запрещает изображать все без исключения линии и треугольники и не требует указывать наследуемые атрибуты и операции в прямоугольниках подклассов, т.к. они уже представлены в обозначении суперкласса.
При моделировании наследования нужно убедиться, что дочерний класс удовлетворяет требованию «является видом» по отношению к родительскому классу. Если связь классов описывается по-другому, нужно использовать другую ассоциацию.
Дочерний класс часто отличается наличием дополнительных атрибутов и операций. Например, млекопитающее имеет шерсть и дает молоко, а такого атрибута и операции нет в классе Животное.
|
|
Класс может не иметь родителя. В этом случае он называется базовым или корневым классом. Класс также может не иметь дочернего класса, и тогда он называется листовым классом. Если класс имеет только одного родителя, то говорят об одиночном наследовании, а если несколько – омножественном наследовании.
Рис. 39. Иерархия наследования
Зависимости
Другой тип взаимосвязи характеризуется тем, что один класс использует другой. Это называется зависимостью. Наиболее общим случаем зависимости является использование одного класса в сигнатуре операции другого класса.
Предположим, нужно спроектировать систему, отображающую на экране монитора формы, заполняемые служащими. Для выбора заполняемой формы используется меню. В системе будут два класса: Система и Форма. В числе операций класса Система имеется операция отобразитьФорму (f: Форма). Отображаемая системой форма, вероятно, зависит от того, какой экземпляр класса Форма выбрал пользователь. В UML это отношение изображается пунктирной линией, направленной от зависимого класса (рис. 40).
Рис. 40. Изображение зависимости
ПРИМЕРЫ