Ответ
Композиция предпочтительнее наследования, когда нужно:
- Собирать функциональность из независимых компонентов
- Избегать жесткой связности (fragile base class problem)
- Гибко менять поведение во время выполнения
Пример с Car, который использует Engine:
class Car(private val engine: Engine) {
fun start() = engine.start()
}
interface Engine {
fun start()
}
class ElectricEngine : Engine {
override fun start() = println("Electric engine started")
}
Плюсы композиции:
- Лучшая тестируемость (можно мокать зависимости)
- Гибкость (легко заменить реализацию)
- Четкое разделение ответственности