Sobes.tech
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("Аутомобил у покрету")
    }
}