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("Մեքենան շարժվում է")
}
}