Sobes.tech
Middle

Kādās situācijās ir noderīga objektorientētās programmēšanas mantošana un kad būtu jāatturas no tās?

sobes.tech AI

Atbilde no AI

Mantošana ir noderīga:

  • Koda atkārtota izmantošana: Kopīgā funkcionalitāte tiek izvietota bāzes klasē.
  • Tipu hierarhijas izveide (is-a attiecība): Kad apakšklaše ir vecāka klases veids.
  • Polimorfisms: Iespēja apstrādāt dažādu tipu objektus, izmantojot kopēju bāzes interfeisu.
  • Funkcionalitātes paplašināšana: Jaunu metožu vai lauku pievienošana esošajai klasei.

No mantošanas vajadzētu atteikties, ja:

  • Liskova aizvietošanas princips tiek pārkāpts: Apakšklaše nevar pilnībā aizstāt vecāka klasi bez programmas pareizības ietekmes.
  • Tiek izveidota stingra saikne starp klasēm: Izmaiņas vecākajā klasē var nevēlamā veidā ietekmēt visas apakšklašu klases.
  • Ir nepieciešams apvienot funkcionalitāti no dažādiem nesasaistītiem avotiem (has-a attiecība): Labāk izmantot kompozīciju.
  • Hierarhijas pārāk liela sarežģītība: Dziļas mantošanas ķēdes ir grūti uzturēt un saprast.
  • Mantošana koda atkārtotai izmantošanai, ja funkcionalitāte nav kopējs "tips": Labāk izmantot pakalpojumu klases vai deleģēšanu.
// Piemērs, kad mantošana ir noderīga
open class Animal {
    open fun makeSound() {
        println("Vispārējs dzīvnieka skaņa")
    }
}

class Dog : Animal() { // Dog IS-A Animal
    override fun makeSound() {
        println("Vau-vau")
    }
}

class Cat : Animal() { // Cat IS-A Animal
    override fun makeSound() {
        println("Mau")
    }
}
// Piemērs, kad kompozīcija ir priekšroka pār mantošanu "has-a" attiecībā
class Engine {
    fun start() { println("Motors ieslēgts") }
}

// Tā vietā, lai mantošanas no Engine
// class Car : Engine() // Slikts dizains, Car NAVs Engine

class Car {
    private val engine = Engine() // Car HAS-A Engine
    fun drive() {
        engine.start()
        println("Mašīna brauc")
    }
}