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

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

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

![](https://1377473627-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LnhxGhlv6e_zwoZYywB%2F-MHumziHua9vkCAs9gjj%2F-MHunoGTZzhx4YvfQc54%2Fimage.png?alt=media\&token=2415bd4a-57e7-4f93-a546-452be68e4e59)

```java
class Vehicle {}
class Car extends Vehicle {}
```

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

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

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

## Композиция

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

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

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

![](https://1377473627-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LnhxGhlv6e_zwoZYywB%2F-MHuosyB5IscfQo618BA%2F-MHurAA1CCssq-q2yp1g%2Fimage.png?alt=media\&token=0df9e3b3-883e-4a88-b7fd-de49068f43cf)

```java
class Car {
    private Wheel[] wheels;

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

class Wheel {}
```
