Ответ
Наследование (extends) создает отношение "является" (например, Dog extends Animal). Плюсы: переиспользование кода. Минусы: жесткая связь, хрупкость (изменения в родителе ломают наследников), ограничение одним родителем.
Композиция - включение объекта как поля (class Car { private Engine engine; }). Отношение "имеет". Плюсы: гибкость (легко менять части), слабая связь, можно комбинировать несколько объектов. Минус: немного больше кода.
Пример композиции:
class Engine { /*...*/ }
class Car(private val engine: Engine) {
fun start() {
engine.start()
}
}
Выбор: предпочитайте композицию, если нет явной иерархии "является". Это принцип SOLID (предпочтение композиции наследованию).