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

  • Наследование - отношение «является»
  • Связь - «имеет» отношение

В этом блоге мы подробно рассмотрим два типа отношений ассоциации - агрегирование и состав.

Что такое отношения ассоциации?

Отношение ассоциации между двумя классами - это отношение «имеет». Например:

  • Car имеет Engine и Wheel
  • Person имеет Leg и Arm
  • Book имеет Pages

Обычно это означает наличие двух классов ClassA и ClassB, либо:

  • ClassA содержит ClassB в качестве атрибута, или
  • Экземпляры ClassB создаются внутри ClassA

В чем разница между агрегированием и композицией?

Существует два подтипа ассоциативных отношений - агрегирование и состав. В чем разница между этими двумя?

Состав

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

Возьмем, к примеру, Page и Book. Page не может существовать без Book, потому что книга состоит из Pages. Если Book уничтожается, Page также уничтожается.

В коде это обычно относится к дочернему экземпляру, создаваемому внутри класса контейнера:

class Book:
    def __init__(self):
       page1 = Page('This is content for page 1')
       page2 = Page('This is content for page 2')
       self.pages = [page1, page2]

class Page:
    def __init__(self, content):
        self.content = content
book = Book() # If I destroy this Book instance,
              # the Page instances are also destroyed

Агрегирование

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

Итак, думая о Car и Engine, Engine не нужно уничтожать, когда Car уничтожается.

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

class Engine:
    def __init__(self):
        pass
engine = Engine()
car = Car(engine) # If I destroy this Car instance,
                  # the Engine instance still exists

Как они представлены на диаграмме UML?

На диаграмме UML и агрегирование, и композиция представлены ромбовидной стрелкой между классами. Конец ромба идет сбоку от контейнера.

  • При агрегировании используется открытый ромб.
  • В композиции используется закрытый ромб.

Вот пример:

Надеюсь, это помогло!