Sobes.tech
Middle

Որ իրավիճակներում օբյեկտային ուղղված ծրագրավորման ժառանգությունը օգտակար է և որ դեպքերում պետք է հրաժարվել նրանից։

sobes.tech AI

Պատասխան AI-ից

Երասխականությունը օգտակար է.

  • Կոդի կրկնօրինակում: Ընդհանուր գործառույթը տեղափոխվում է հիմնական դաս:
  • Տիպերի հիերարխիաներ ստեղծել (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-ից՝
// class Car : Engine() // Լավ չէ, Car - չի հանդիսանում Engine

class Car {
    private val engine = Engine() // Car ունի-Engine
    fun drive() {
        engine.start()
        println("Մեքենան շարժվում է")
    }
}