Какая есть альтернатива наследованию класса?

«Какая есть альтернатива наследованию класса?» — вопрос из категории ООП, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

  1. Композиция (Composition) — включение объектов других классов как полей. Это предпочтительный подход, так как позволяет динамически менять поведение и следует принципу «предпочити композицию наследованию».

    // Пример на Java
    class Engine {
        public void start() { System.out.println("Engine started"); }
    }
    
    class Car {
        private Engine engine; // Композиция
    
        public Car(Engine engine) {
            this.engine = engine;
        }
    
        public void startCar() {
            engine.start(); // Делегирование
        }
    }
  2. Агрегация (Aggregation) — частный случай композиции с более слабой связью, где объект-часть может существовать независимо от целого.

  3. Интерфейсы (Interfaces) — определяют контракт, который классы реализуют. Это позволяет достичь полиморфизма без наследования реализации.

    interface Drivable {
        void drive();
    }
    
    class Car implements Drivable {
        public void drive() { /* реализация */ }
    }
    
    class Bike implements Drivable {
        public void drive() { /* другая реализация */ }
    }
  4. Делегирование (Delegation) — явная передача ответственности за выполнение задачи другому объекту (как в примере с Car и Engine выше).

  5. Примеси (Mixins) / Трейты (Traits) — в языках, которые их поддерживают (например, PHP с traits, Scala с traits), позволяют включать готовые блоки кода в классы.

Почему композиция лучше? Она создает более гибкую и тестируемую архитектуру, уменьшает связность и позволяет следовать принципу единственной ответственности (SRP).