Что такое агрегация в объектно-ориентированном программировании?

Ответ

Агрегация — это тип ассоциации между классами, представляющий отношение «has-a» (имеет), где один класс (целое) содержит ссылку на другой класс (часть), но часть может существовать независимо от целого. Это отношение слабее, чем композиция.

Пример на Java:

// Класс-часть
class Engine {
    public void start() {
        System.out.println("Engine started");
    }
}

// Класс-целое
class Car {
    private Engine engine; // Агрегация: Car имеет Engine

    // Engine передаётся извне и может существовать отдельно
    public Car(Engine engine) {
        this.engine = engine;
    }

    public void startCar() {
        engine.start();
    }
}

// Использование
Engine myEngine = new Engine();
Car myCar = new Car(myEngine); // Engine создан независимо
myCar.startCar();

Ключевые отличия от композиции:

  • Агрегация: Часть имеет независимый жизненный цикл. Уничтожение целого не влечёт уничтожение части.
  • Композиция: Часть не может существовать без целого (например, Room не может существовать без Building). Часть создаётся и уничтожается вместе с целым.

Ответ 18+ 🔞

Давай разберём эту вашу "агрегацию", а то звучит как диагноз из поликлиники. Сидишь такой, читаешь про отношения «has-a», и думаешь — ну вот опять эти умники накрутили терминов, чтоб мозг выебать. А на деле всё проще пареной репы, ей-богу.

Смотри, представь себе машину и двигатель. Машина имеет двигатель — это и есть «has-a», понятно? Но двигатель-то, сука, не приварен намертво! Его можно вынуть, нахуярить в другую тачку, или вообще на запчасти разобрать. Двигатель живёт своей отдельной жизнью. Вот это и есть агрегация — когда одна штука содержит другую, но та другая может и сама по себе пожить, не помирая сразу, как только первая накрылась медным тазом.

А теперь смотри на код, тут всё наглядно:

// Вот тебе двигатель — самостоятельная хуйня
class Engine {
    public void start() {
        System.out.println("Engine started");
    }
}

// А вот машина — целое
class Car {
    private Engine engine; // Вот она, агрегация! Машина ИМЕЕТ двигатель.

    // Ключевой момент, блядь! Двигатель ей ПЕРЕДАЮТ извне, как пас в футболе.
    // Он уже где-то там был создан, живёт-поживает.
    public Car(Engine engine) {
        this.engine = engine;
    }

    public void startCar() {
        engine.start(); // И машина им пользуется
    }
}

// Как это всё работает в жизни:
Engine myEngine = new Engine(); // Сначала рождается двигатель. Сам по себе, блядь!
Car myCar = new Car(myEngine); // Потом его засовывают в машину. А мог бы и в трактор!
myCar.startCar();

Видишь? Сперва Engine создали. Потом скормили его Car. Если машину (myCar) в утиль отправят, двигатель (myEngine) — не помрёт! Его можно вытащить и запихнуть в другую машину, продать, на стенку повесить. Жизненные циклы — независимые. Это и есть суть.

А теперь, чтобы не было каши в башке, главное отличие от композиции:

  • Агрегация (про которую тут речь): Часть живёт сама по себе. Уничтожил целое — часть выжила. Как двигатель и машина. Или как программист и его мозг — вроде вместе, но мозг может и на другую работу уйти, сука.
  • Композиция: Это уже жёсткая привязка, пиздец. Часть не может жить без целого. Уничтожил целое — часть труп. Как комната и здание. Нет здания — где, блядь, комната? В воздухе что ли висит? В коде это выглядело бы так, что Room создаётся внутри конструктора Building и снаружи него не существует.

Короче, агрегация — это как временный сожитель, а композиция — как сросшиеся сиамские близнецы. Уловил разницу, или тебе ещё раз, но с матами?