В объектно-ориентированном программировании существует множество различных типов отношений, которые могут существовать между двумя или более классами. Наиболее распространены два типа:
- Наследование - отношение «является»
- Связь - «имеет» отношение
В этом блоге мы подробно рассмотрим два типа отношений ассоциации - агрегирование и состав.
Что такое отношения ассоциации?
Отношение ассоциации между двумя классами - это отношение «имеет». Например:
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 и агрегирование, и композиция представлены ромбовидной стрелкой между классами. Конец ромба идет сбоку от контейнера.
- При агрегировании используется открытый ромб.
- В композиции используется закрытый ромб.
Вот пример:
Надеюсь, это помогло!