Наследование - Объектно-ориентированный подход и диаграммы классов в UML

Наследование - это отношение типа общее-частное между элементами модели.

Наследование пакетов означает, что в пакете-наследнике все сущности пакета-предка будут видны под своими собственными именами (т. е. пространства имен объединяются). На практике наследование пакетов применяется достаточно редко (в Rational Rose (классическая реализация UML) такая возможность не поддерживается).

Наследование показывается сплошной линией, идущей от конкретного элемента к более общему (в терминологии ООП - от потомка к предку, от сына к отцу, или от подкласса к суперклассу). Со стороны более общего элемента рисуется большой полый треугольник.

Один из атрибутов отношения наследования - дискриминатор (discriminator) - строка, задающая имя группы потомков [5], [2]. Его использование полезно, если у данного класса много потомков, и мы хотим разбить их на несколько групп. Отсутствие дискриминатора означает, что дискриминатор - пустая строка (дискриминатор по умолчанию). Изображается дискриминатор текстовой строкой, стоящей возле линии наследования.

Способ изображения наследования показан на следующем рисунке:

На рис. 12 geometry - это дискриминатор, а {disjoint} - его дополнительное свойство, на описании которого мы остановимся ниже.

Остановимся на понятии множественного наследования. Возвращаясь к примеру, с которого мы начинали эту статью, можно сказать, что Телевизор (как класс, а не как отдельный представитель) наследуется от классов Деревянный_Ящик и Устройство_Отображения (см. рисунок 14). При этом класс Устройство_Отображения инкапсулирует стандартную электронную начинку, а класс Деревянный_Ящик - только физическую оболочку. Во многих современных языках программирования множественное наследование запрещено. Связано это со следующей проблемой. Представим себе, что класс A наследуется от классов B и C, а классы B и C, в свою очередь, имеют общего предка D (см. рис. 13). Такая ситуация называется перекрывающимся наследованием. Какой из экземпляров D будет храниться в экземпляре A? Для решения этой проблемы была разработана концепция виртуального наследования, обеспечивающая единственность экземпляра класса D в памяти. Но ее использование небезопасно и нетривиально.

Для того чтобы уточнить подробности, касающиеся множественного наследования, на дискриминатор могут накладываться дополнительные ограничения (constraint):

    - disjoint - запрещение множественного наследования; - overlapping - разрешение множественного наследования.

В контексте рисунка 12 первое свойство означает, что нельзя в множественном наследовании использовать двух потомков класса figure, если они произведены от него через ветку наследования, помеченную дискриминатором geometry. (На рисунке 15 показана неправильна ошибочная ситуация.) Если бы этот дискриминатор имел свойство {overlapping}, то это было бы возможно.(На рисунке 13 показана ситуация, невозможная для наследования со свойством {disjoint}, но возможная для случая {overlapping}.) По умолчанию дискриминатор имеет свойство {overlapping}

Для дискриминатора можно указать дополнительные ограничения, не касающиеся множественного наследования:

    - Complete (полный) - все потомки рассматриваемого класса определены (возможно, не показаны на данной диаграмме), и список потомков не может быть расширен; - Incomplete (неполный) - возможно появление новых классов-потомков.

В примере на рис. 16 запрещено наследование новых классов от класса CHttpServer:

Похожие статьи




Наследование - Объектно-ориентированный подход и диаграммы классов в UML

Предыдущая | Следующая