Композиція (програмування)

Композиція у програмуванні або ж Об'єктна композиція, також Агрегація та включення — це створення об'єктів існуючих класів як елементів інших класів. Про композицію також часто говорять як про «відношення приналежності» за принципом у «у машини є корпус, колеса і двигун». Агрегація або включення організоване за принципом «у машини є модель».

Вкладені об'єкти нового класу зазвичай оголошуються закритими, що робить їх недоступними для прикладних програмістів, що працюють з класом. З іншого боку, творець класу може змінювати ці об'єкти, не порушуючи роботи існуючого клієнтського коду. Крім того, заміна вкладених об'єктів на стадії виконання програми дозволяє динамічно змінювати її поведінку. Механізм успадкування такої гнучкості не має, оскільки для похідних класів встановлюються обмеження, що перевіряються на стадії компіляції.

На відміну від успадкування, в композиції тип відносин є Has-a тобто має (машина має двигун). В наслідуванні ж тип відносин між породженим об'єктом і батьківським є Is-a зв'язком, тобто якщо об'єкт кішка породжено від тварина, то кішка є тварина (cat is a pet).

UML позначення ред.

В UML позначається як замальований ромб і суцільна лінія. Це завжди позначається 1 або 0..1, як не більше ніж один об'єкт за один раз може мати відношення до іншого об'єкта.

Загальніша форма, агрегація, зображається, як порожній ромб і суцільна лінія.

 

Різниця між агрегацією і композицією полягає в тому, що у зв'язку композиція життя об'єкта контролюється його «володарем», а під час агрегації — не контролюється.

Приклади коду ред.

// Composition
class Car
{
  private:
    Carburetor* itsCarb;
  public:   
    Car() {itsCarb=new Carburetor();}
    virtual ~Car() {delete itsCarb;}
};
// Aggregation
class Pond
{
  private:
    vector<Duck*> itsDucks;
};

Див. також ред.