Вопрос проверяет понимание принципов объектно-ориентированного проектирования, в частности, почему композиция предпочтительнее наследования для создания гибких и поддерживаемых систем.
Основной аргумент в пользу композиции перед наследованием заключается в том, что композиция обеспечивает большую гибкость и переиспользуемость кода, избегая жестких иерархических связей, характерных для наследования. Наследование создает тесную связь между родительским и дочерним классами, что делает систему хрупкой: изменения в базовом классе могут непреднамеренно повлиять на все производные классы. Композиция, напротив, позволяет строить объекты из независимых компонентов, которые можно легко заменять или комбинировать.
// Наследование (проблемный подход)
class Animal {
speak() { return '...'; }
}
class Dog extends Animal {
speak() { return 'Woof'; }
}
// Композиция (гибкий подход)
const canSpeak = (sound) => ({
speak: () => sound
});
function createDog() {
return Object.assign({}, canSpeak('Woof'));
}
const dog = createDog();
console.log(dog.speak()); // WoofВ примере выше композиция позволяет легко добавить новое поведение (например, canFly) без изменения существующей иерархии. Вывод: композиция предпочтительна, когда требуется гибкость и возможность изменять поведение объектов динамически, особенно в больших и сложных системах.