Какое отношение между классами будет?

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

public class Car{ 
    private Engine engine;
    public Car(){ 
       engine = new Engine();
    }
}

Агрегация это когда один класс содержит другой класс, например двигатель передается в конструктор автомобиля и уже может существовать без автомобиля, даже если он будет уничтожен.

public class Car{
    private Engine engine;
    public Car(Engine engine){
        this.engine = engine;
    }
}

То тогда вопрос, если я создаю абстрактный класс Engine и два наследника EclctricMotor и FuelEngine и добавляю его поле в класс Car, а в конструкторе создаю экземпляр его наследника, скажем FuelEngine(по сути композиция) и создаю сеттер на двигатель(что уже по сути агрегация), то какое отношение будет иметь класс автомобиль по отношению к классу двигатель? Ведь он получается содержит и композицию и агрегацию ?‍♂️

public class Car{
    private Engine engine;
    public Car(){
        engine = new Engine();
    }
    public setEngine(Engine engine){
        this.engine = engine;
    }
}

Что то вроде этого введите сюда описание изображения

P.S. На диаграмме отобразил интерфейс engine. Но в данном случае это роли не играет


Ответы (2 шт):

Автор решения: Igor

"Композиция", "агрегация" - бессмысленные ярлыки.

Автомобиль содержит двигатель - вот их отношение.

→ Ссылка
Автор решения: Aziz Umarov

Это одно и тоже, просто взгляд снутри и снаружи. Композиция это собрание как бы независимых деталей в одно целое. И целое агрегированные из деталей. По сути это поля объекта и как они проинициализированы и используются объекту ровно, это важно только пользователю

→ Ссылка