OOP: Это композиция, если компонент разрушается при уничтожении объекта, но этот компонент может использоваться одинаково для разных объектов? - PullRequest
0 голосов
/ 19 июня 2020

Предположим, что класс Car всегда создает один и тот же объект, за исключением того, что каждый из объектов Car может иметь внутри свой двигатель.

Это композиция, потому что когда объект Car разрушается, его двигатель также разрушается ?

Или это агрегация, потому что один и тот же тип двигателя может быть внутри разных автомобильных объектов?

Я думаю, что меня смущает вопрос о том, является ли какой-то класс композицией или агрегацией. Если вы основываете свое решение на том, уничтожается ли компонент при уничтожении его объекта, что такое компонент? Является ли компонент конкретным экземпляром двигателя, который был специально создан для автомобиля, или это класс двигателя в целом? В первом случае я хочу сказать, что это композиция, во втором я хочу сказать, что это агрегация.

Извините, я не могу опубликовать детали кода, мне не разрешено. Я просто хочу получить абстрактный ответ.

1 Ответ

1 голос
/ 20 июня 2020

Я думаю об этом так:

  • зависимость существования (существование чего-то в зависимости от существования другого)
  • с использованием слова «использует» для агрегирования и «владеет» "для композиции

Пример объединения:

  • Группа musi c использует людей . Если вы уничтожите группу, это не обязательно «уничтожит» людей. Это означает, что существование людей не зависит от существования группы, поскольку вы можете создать другую группу с теми же людьми.

Пример состава:

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

Таким образом, взаимосвязь автомобиля и двигателя может быть обоими, и все зависит от того, как вы хотите разработать свой код, но я бы подумал об этом как об агрегации, поскольку вы можете использовать один и тот же экземпляр Motor в два разных автомобиля, или вы можете изменить двигатель автомобиля.

При разработке кода подумайте, где лучше всего создать экземпляр двигателя:

  • Если вы создаете экземпляра Motor внутри класса Car, существование экземпляра Motor будет зависеть от существования экземпляра Car, в котором он был создан. (Состав)

В Python:

class Motor:
   ...

class Car:
def __init__(self):
   self.motor = Motor()

my_car = Car()
  • Если вы создаете экземпляр Motor вне класса Car, существование экземпляра Motor не будет зависеть от существования экземпляра Car, которому вы его передали. (Агрегация)

In Python:

class Motor:
   ...

class Car:
def __init__(self, motor):
   self.motor = motor

fast_motor = Motor()
my_car = Car(fast_motor)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...