Middle
У којим ситуацијама је наслеђивање у објектно-оријентисаном програмирању корисно, а у којима треба одустати од њега?
sobes.tech АИ
Одговор од АИ
Наследство је корисно за:
- Поновну употребу кода: Заједничка функционалност се преноси у основну класу.
- Креирање хијерархија типова (однос is-a): Када подкласа је варијанта основне класе.
- Полиморфизам: Могућност обраде објеката различитих типова преко заједничког интерфејса основне класе.
- Проширење функционалности: Додавање нових метода или поља у постојећу класу.
Избегавајте наследство када:
- Постоји кршење Лисковог принципа замене: Подкласа не може у потпуности заменити основну класу без промене исправности програма.
- Настаје чврста веза између класа: Промене у основној класи могу непожељно утицати на све подкласе.
- Потребно је комбиновати функционалност из различитих, неповезаних извора (has-a однос): Боље је користити композицију.
- Тежак је одржавање и разумевање дубоких ланаца наследства:
- Наследство за поновну употребу кода када функционалност није заједнички "тип": Боље је користити помоћне класе или делегирање.
// Пример, када је наследство корисно
open class Animal {
open fun makeSound() {
println("Генерички звук животиње")
}
}
class Dog : Animal() { // Dog ЈЕ-ЈЕДАН Animal
override fun makeSound() {
println("Гауу")
}
}
class Cat : Animal() { // Cat ЈЕ-ЈЕДАН Animal
override fun makeSound() {
println("Мјау")
}
}
// Пример, када је композиција пожељнија од наследства за однос "has-a"
class Engine {
fun start() { println("Мотор је покренут") }
}
// Уместо наследства од Engine за Car
// class Car : Engine() // Лош дизајн, Car НИЈЕ-ЈЕДАН Engine
class Car {
private val engine = Engine() // Car ИМА-Engine
fun drive() {
engine.start()
println("Аутомобил у покрету")
}
}