← Назад к вопросам

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

2.3 Middle🔥 201 комментариев
#Kotlin основы#Архитектура и паттерны

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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

Это фундаментальный вопрос архитектуры приложения. Композиция считается более гибким и безопасным подходом, чем наследование.

Наследование

Это отношение IS-A (является). Дочерний класс наследует все свойства и методы родительского.

open class Animal {
    open fun makeSound() = println("Some sound")
}

class Dog : Animal() {
    override fun makeSound() = println("Woof!")
}

Проблемы наследования:

  • Жесткая иерархия классов
  • Нарушает принцип Single Responsibility
  • Хрупкая база (изменение родителя ломает детей)
  • Множественное наследование запрещено в Kotlin

Композиция

Это отношение HAS-A (имеет). Объект содержит другие объекты вместо наследования.

interface Sound {
    fun makeSound()
}

class DogSound : Sound {
    override fun makeSound() = println("Woof!")
}

class Animal(private val sound: Sound) {
    fun speak() = sound.makeSound()
}

Преимущества композиции

1. Гибкость — легко менять поведение во время выполнения

2. Тестируемость — просто создавать моки

3. Слабая связанность — изменения в одном компоненте не ломают другие

4. Single Responsibility Principle — каждый класс отвечает за одно

Практический пример

interface Engine {
    fun start()
}

class CarEngine : Engine {
    override fun start() = println("Car engine starts")
}

class Vehicle(private val engine: Engine) {
    fun start() = engine.start()
}

Когда использовать

Наследование — редко, для настоящих IS-A отношений

Композиция — в большинстве случаев современной Android разработки

Правило: Компонуй больше, наследуй меньше.

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