Ответ
Композиция — лучшая альтернатива наследованию. Вместо расширения класса можно включать объекты других классов как поля. Это уменьшает связность и делает код гибче.
Пример:
class Engine { /*...*/ }
// Вместо наследования Car : Vehicle
class Car(private val engine: Engine) {
fun start() = engine.start()
}
Другие подходы:
- Интерфейсы (реализация через
implements) - Делегирование (через
byв Kotlin) - Паттерны (Стратегия, Декоратор)
Преимущества:
- Избегаем хрупкости базового класса
- Легче тестировать (можно мокировать зависимости)
- Поддержка принципа SOLID (особенно D — Dependency Inversion)