Введение

Отношения композиции в объектно-ориентированном программировании

В проектировании баз данных, объектно-ориентированном программировании и проектировании, отношение "имеет" (или "состоит из") является отношением композиции, где один объект (часто называемый составным объектом, или частью/компонентом/элементом) "принадлежит" (является частью или элементом) другого объекта (называемого композитным типом) и ведет себя в соответствии с правилами владения. Проще говоря, отношение "имеет" в объекте называется полем-членом объекта. Множество отношений "имеет" объединяются, формируя иерархию владения.

Модель отношений между субъектами

В базах данных отношения обычно представляются в ER-модели (Entity-Relationship). Как видно на диаграмме справа, у аккаунта может быть несколько персонажей. Это показывает, что аккаунт имеет отношение "имеет" к персонажу.

Диаграмма классов UML

В объектно-ориентированном программировании это отношение можно представить с помощью диаграммы классов языка унифицированного моделирования (UML). Это отношение также известно как композиция. Как видно из диаграммы классов справа, автомобиль "имеет" карбюратор, или автомобиль "состоит из" карбюратора. Если ромб закрашен черным цветом, это указывает на композицию, то есть объект со стороны, ближайшей к ромбу, состоит из другого объекта или содержит его. В то время как белый ромб указывает на агрегацию, что означает, что объект, ближайший к ромбу, может иметь или владеть другим объектом.

C++

Другой способ различать композицию и агрегацию при моделировании реального мира — рассмотреть относительный срок службы содержащегося объекта. Например, если объект «Автомобиль» содержит объект «Шасси», то «Шасси», скорее всего, не будет заменено в течение срока службы «Автомобиля». Оно будет иметь такой же срок службы, как и сам «Автомобиль», следовательно, отношения будут композиционными. С другой стороны, если объект «Автомобиль» содержит набор объектов «Шина», эти объекты «Шина» могут изнашиваться и заменяться несколько раз. Или, если «Автомобиль» станет непригодным для использования, некоторые «Шины» могут быть сохранены и использованы для другого «Автомобиля». В любом случае, объекты «Шина» имеют срок службы, отличный от срока службы объекта «Автомобиль»; следовательно, отношения являются агрегационными. Если бы кто-то создавал программный класс C++ для реализации описанных выше отношений, объект «Автомобиль» содержал бы полный объект «Шасси» в качестве члена данных. Этот объект «Шасси» был бы создан в конструкторе класса «Автомобиль» (или определен как тип данных члена данных, а его свойства присвоены в конструкторе). И поскольку это был бы полностью содержащийся член данных класса «Автомобиль», объект «Шасси» перестал бы существовать при удалении объекта класса «Автомобиль». С другой стороны, члены данных класса «Автомобиль», указывающие на объекты «Шина», скорее всего, были бы указателями C++. Объекты «Шина» могли бы быть созданы и удалены вне класса, или даже назначены членам данных другого объекта «Автомобиль». Объекты «Шина» имели бы независимый срок службы, отличный от срока службы объекта «Автомобиль».