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

«Что такое композиция в объектно-ориентированном программировании?» — вопрос из категории Основы программирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Ключевое отличие от наследования:

  • Наследование — это отношение «is-a» (является). Класс-потомок наследует структуру и поведение родителя.
  • Композиция — отношение «has-a». Класс использует функциональность другого класса, не наследуя его.

Пример на Python:

class Engine:
    def start(self):
        return "Двигатель запущен"

class Car:
    def __init__(self):
        # Композиция: Car содержит (has-a) объект Engine
        self.engine = Engine()

    def start(self):
        # Делегирование вызова методу вложенного объекта
        return self.engine.start()

# Использование
my_car = Car()
print(my_car.start())  # Вывод: Двигатель запущен

Преимущества композиции:

  • Гибкость: Поведение можно динамически менять, подменяя компоненты во время выполнения.
  • Слабая связанность: Классы зависят от интерфейсов, а не от конкретных реализаций.
  • Избегание проблем наследования: Нет хрупкости базового класса, не нарушается инкапсуляция.
  • Соответствует принципу: Является реализацией принципа «Предпочитай композицию наследованию» (GoF).