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

Матеріал з Вікіпедії — вільної енциклопедії.
Версія від 11:56, 6 березня 2017, створена VictorAnyakin (обговорення | внесок) (→‎Приклади коду)
(різн.) ← Попередня версія | Поточна версія (різн.) | Новіша версія → (різн.)
Перейти до навігації Перейти до пошуку

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

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

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

UML позначення[ред. | ред. код]

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

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

AggregationAndComposition.svg

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

Приклади коду[ред. | ред. код]

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