В чем разница между наследованием и композицией

«В чем разница между наследованием и композицией» — вопрос из категории ООП, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Наследование (extends) создает отношение "является" (например, Dog extends Animal). Плюсы: переиспользование кода. Минусы: жесткая связь, хрупкость (изменения в родителе ломают наследников), ограничение одним родителем.

Композиция - включение объекта как поля (class Car { private Engine engine; }). Отношение "имеет". Плюсы: гибкость (легко менять части), слабая связь, можно комбинировать несколько объектов. Минус: немного больше кода.

Пример композиции:

class Engine { /*...*/ }
class Car(private val engine: Engine) {
    fun start() {
        engine.start()
    }
}

Выбор: предпочитайте композицию, если нет явной иерархии "является". Это принцип SOLID (предпочтение композиции наследованию).