В чем разница между композицией и наследованием?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между композицией и наследованием
Это фундаментальный вопрос архитектуры приложения. Композиция считается более гибким и безопасным подходом, чем наследование.
Наследование
Это отношение 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 разработки
Правило: Компонуй больше, наследуй меньше.