Наследование и композиция в UML

Наследование (обобщение)

Отношение обобщения (generalization) в UML изображается при помощи сплошной линии и жирной треугольной стрелки, ведущей от подкласса с суперклассу.

class Vehicle {}
class Car extends Vehicle {}

Что обозначает это отношение? В спецификации UML по этому поводу сказано

Обобщение - таксономическое отношение между более общим элементом и более конкретным. Каждый экземпляр конкретного элемента также является непрямым экземпляром обобщенного элемента. Таким образом, конкретизированный элемент косвенно обладает свойствами обобщенного элемента

Является ли отношение обобщения синонимом наследования (inheritance) в объектно-ориентированном проектировании? Ответ зависит от области применения отношения. Для диаграммы концептуальных классов из модели предметной области ответом будет "нет". В этом случае отношение обобщения подразумевает то, что суперкласс является множеством, а подкласс - подмножеством. С другой стороны, на диаграмме классов проектирования это отношение подразумевает объектно-ориентированное наследование свойств подкласса от суперкласса.

Композиция

Композиция (composition), так же известная как композитная агрегация (composite aggregation), является строго определенным типом связи "целое-часть" и полезна в некоторых моделях. Отношение композиции предполагает, что

  1. экземпляр части (например, Wheel) в каждый момент времени принадлежит только одному целому предмету (например, Car);

  2. часть всегда принадлежит целому (пальцы не существуют отдельно от руки);

  3. целое ответственно за создание и удаление своих частей - либо через самостоятельное создание\удаление, либо через взаимодействие с другими объектами. Следствием этих ограничений является то, что при уничтожении композитного объекта его части должны быть либо уничтожены, либо присоединены в другому композитному объекту. Например, если реальная настольная игра "Монополия" уничтожается, то также уничтожаются все ее клетки (с концептуальной точки зрения). Аналогично, если программный объект Car уничтожается, то уничтожаются и программные объекты Wheel.

Для обозначения композиции в UML используется закрашенный ромб на линии ассоциации со стороны целого.

class Car {
    private Wheel[] wheels;

    public Car() {
        this.wheels = new Wheel[4];
    }
}

class Wheel {}

Last updated