Úvod k prvoradým požiadavkám na OOP

Pri implementácii koncepcie dedičnosti v oops sa všetky funkcie v nadradenej triede používajú vo všetkých odvodených triedach. Ale v prípade, že jedna odvodená trieda chce špecifickú implementáciu funkcie, ktorá bola deklarovaná v nadradenej triede, ale používajú rovnaké meno, rovnaký podpis a rovnaký návratový typ, potom sa použije prvoradá funkcia. Prepísanie umožňuje podradenej triede nadefinovať funkciu, ktorá už bola definovaná vo svojej nadradenej triede alebo nadtriede. Týmto spôsobom je možné použiť obe definície tak, že pri volaní metódy zadáte objekt triedy. Napríklad, ak existuje funkcia sum v rodičovskej aj podradenej triede a pri volaní funkcie používame objekt podradenej triedy, zavolá sa metóda prítomná v podradenej triede a namiesto toho, ak používate objekt nadradenej triedy, potom je prítomná metóda v nadradenej triede sa bude volať. táto metóda v podradenej triede má prednosť pred metódou prítomnou v jej nadtriedach.

Potreba prepísania metódy

Nasledujú spôsoby potlačenia:

  • Metóda overovania polymorfizmu runtime pomáha dosiahnuť runtime polymorfizmus v objektovo orientovaných programovacích jazykoch ako c ++, java, c #, atď.
  • Polymorfizmus znamená mať veľa foriem, tj jeden podpis a viac definícií. v objektovo orientovaných jazykoch, keď odvodená aj nadradená trieda majú rovnaké meno a podpis funkcie, potom pri jednorazovom prekladači vyrieši definíciu, ktorú musí volať. Runtime polymorfizmus znamená, že definícia metódy sa viaže na volanú metódu, ktorá sa vyskytuje za behu programu. Umožňuje implementáciu aspektu polymorfizmu „viacnásobná definícia jedného podpisu“. Táto funkcia využíva dispečing dynamických metód, ktorý má silný koncept objektovo orientovaného dizajnu, aby priniesol opakované použitie kódu a robustnosť. Prepísanie metódy nám umožňuje volanie metódy do ktorejkoľvek z odvodených tried bez toho, aby sme poznali typ objektu odvodenej triedy.
  • Použitím tejto funkcie je možné implementovať špecializovanú definíciu na generickú funkciu, ktorá bola zdedená zo svojej nadtriedy.

Ako funguje Overriding v OOP?

Nižšie uvedené vysvetlenie hovorí, že ako prevažujúce funguje:

  • OOP, pomôžte nám implementovať runtime polymorfizmus a zároveň zdediť vlastnosti triedy do iného. Pozrime sa na prácu nadradeného OOP. Neskôr predpokladajme, že máme supertriedne meno zvieraťa, ktoré má dve funkcie hovoriť a jesť. Existujú dve podtriedy mačka a pes, ktoré rozširujú názov nadtriedy zviera.
  • Tieto dve podtriedy používajú rovnaké funkcie hovorenia a jedenia, ale menia implementáciu, ale zachovávajú rovnaký podpis metód. Teraz, v našej hlavnej metóde, ak voláte tieto funkcie výberom referenčnej premennej, potom sa za runtime iba rozhodne, ktorá funkcia musí volať. Napríklad, ak objekt drží rozdiel podradenej triedy, ktorou je mačka alebo pes, potom sa funkcia príslušnej triedy nazýva inak, ak objekt drží odkaz na rodičovskú triedu, potom sa vyvolá funkcia zvieracej triedy.
  • Tu by sme mali vidieť, že funkcia sa volá, nezávisí od typu referenčnej premennej. Toto je rozhodnuté kompilátorom za behu, len to pomáha implementovať runtime polymorfizmus. Pomáha tiež implementovať špecializovanú definíciu metódy generickej definície metódy do rodičovskej triedy.

kód:

class Animal(
//Overridden method
public void eat()
(
System.out.println("Animal is eating");
)
public void speak()
(
System.out.println("Animal is speaking");
)
)
class Cat extends Animal(
//Overriding method
public void eat()
(
System.out.println("Cat is eating");
)
public void speak()
(
System.out.println("Cat is meowing");
)
)
class Dog extends Animal(
//Overriding method
public void eat()
(
System.out.println("Dog is Barking");
)
public void speak()
(
System.out.println("Dog is speaking");
)
)
public class Test(
public static void main(String() args)(
Animal an=new Dog();
Animal an1 = new Cat();
Animal an2 = new Animal();
an.speak();
an.eat();
an1.speak();
an1.eat();
an2.eat();
)
)

Výkon:

Poznámka: Referenčnú premennú typu dieťa nemožno použiť na uchovanie odkazu na rodičovský typ.

Pravidlá pre potlačenie metódy

Nasledujú pravidlá prevládania:

Pravidlo č. 1

Zoznam parametrov deklarovaných vo funkcii nadradenej triedy by sa mal zhodovať so zoznamom parametrov uvedených v definícii nadradenej metódy v podradenej triede.

Napríklad:

Metóda v materskej triede

public int test1(int a);

Metóda v podradenej triede - verejný reťazec test1 (); // prepísanie metódy tu nebude podporovaná, pretože návratový typ a argumenty sú rôzne, ale nedôjde k chybe pri kompilácii. Táto metóda sa bude považovať za novú metódu podradenej triedy.

Pravidlo č. 2

Návratový typ metódy prítomnej v podradenej triede musí byť rovnaký alebo podtyp návratového typu overovanej metódy.

Napríklad:

Metóda v nadradenej triede

public Object test1(int a);

Metóda v triede detí

public String test1();

nesprávny

Metóda v materskej triede

public String test1(int a);

Metóda v triede detí

public Object test1();

Pravidlo č. 3

Špecifikátor prístupu, ktorý je prítomný v metóde nadradenej triedy, musí byť rovnako reštriktívny alebo reštriktívnejší ako metóda, ktorá ju nadradila v podradenej triede.

nesprávny

Metóda v materskej triede

public int test1(int a);

Metóda v podradenej triede

private int test1() ; // more restrictive than public one

Pravidlo č. 4

Prepísať sa dá iba metóda inštancie s prístupovým špecifikátorom ako verejne chránená alebo predvolená. Je to tak preto, že iba táto metóda inštancie môže byť zdedená svojou podtriedou a tak sa dá povedať, že je prepísaná. V prípade, že metóda inštancie špecifikovaná v nadradenej triede je reštriktívnejšou príkladom verejnej metódy, nebude zdedená vo svojej podtriede a urobí, ak niekto definuje tú istú metódu v podtriede, že scenár sa nepovažuje za prvoradú metódu, pretože verejné metódy nemôžu byť zdedený, toto nemôže byť potlačené.

Napríklad:

Metóda v materskej triede

public int test1(int a); //can be inherited and overridden

Metóda v triede detí

private int test1();

nesprávny

Metóda v materskej triede

private int test1(int a); //can not be inherited and overridden

Metóda v triede detí

private int test1();//not overriding method of the parent class

Považuje sa za novú súkromnú metódu triedy pre deti

Pravidlo č. 5

Super kľúčové slovo sa môže použiť na volanie funkcie nadradenej triedy, ktorá bola potlačená jej podtriedou.

class Animal(
//Overridden method
public void eat()
(
System.out.println("Animal is eating");
)
public void speak()
(
System.out.println("Animal is speaking");
)
)
class Dog extends Animal(
//Overriding method
public void eat()
(
System.out.println("Dog is Barking");
)
public void speak()
(
super.speak(); // Here super keyword is used to call the speak function of the super class.ieAnimal
)
)
public class Test(
public static void main(String() args)(
Animal an=new Dog();
Animal an2 = new Animal();
an.speak();
an.eat();
an2.eat();
)
)

Výkon:

Pravidlo č. 6

Konštruktor triedy nemôže byť jeho podtriedami potlačený, pretože konštruktor dvoch tried nemôže byť rovnaký.

Pravidlo č. 7

Manipulácia výnimiek pri potlačení.

  • Metóda zapuzdrenia v nadradenej triede nevyvoláva žiadnu výnimku, potom je prvoradou metódou, ktorá je prítomná v podtriede, vyvolaná iba nezaškrtnutá výnimka. V prípade, že nadradená metóda zobrazuje začiarknutú výnimku, kompilátor zobrazí chybu.
  • Ak metóda v nadradenej triede, ktorá je potlačená, vyvolá výnimku tandemovej metódy, ktorá je prítomná v podtriede, musí prostredníctvom výnimky rovnakej úrovne alebo jej podtypu v hierarchii výnimiek alebo vôbec žiadna výnimka.

Pravidlo č. 8

Je tiež možné potlačiť metódu viacúrovňového dedičstva.

kód:

class Creature (
//Overriding method
public void eat()
(
System.out.println("Creature is eating");
)
public void speak()
(
System.out.println("Creature is speaking");
)
)
class Animal extends Creature(
//Overridden method
public void eat()
(
System.out.println("Animal is eating");
)
public void speak()
(
System.out.println("Animal is speaking");
)
)
class Dog extends Animal(
//Overriding method
public void eat()
(
System.out.println("Dog is Barking");
)
public void speak()
(
System.out.println("Dog is speaking");
)
)
public class Test(public static void main(String() args)(
Creature an=new Dog();
Animal an1 = new Animal();
Animal an2 = new Dog();
an.speak();
an.eat();
an1.speak();
an1.eat();
an2.eat();
)
)

Výkon:

Pravidlo č. 9

Základné pravidlá v jazyku Java

  • Synchronizovaná metóda môže byť ľahko potlačená nesynchronizovanou metódou a naopak.
  • Abstraktná metóda prítomná v abstraktných triedach alebo rozhraniach má byť prepísaná tak, aby poskytla špecifickú implementáciu deklarovaným metódam, inak bude vykazovať chybu pri kompilácii.
  • Definovanie statickej metódy s rovnakým názvom ako statická metóda prítomná v nadradenej triede je známe ako skrytie metódy, ktorá nie je prvoradou metódou, pretože nevykonáva runtime polymorfizmus.
  • Konečné metódy nemôžu byť potlačené.

Pravidlo č. 10

Metóda nahradenia v C ++

Prepísanie metódy v plus sa dosiahne vyhlásením metódy za virtuálnu. Virtuálne kľúčové slovo sa používa na dosiahnutie runtime polymorfizmu v jazyku c ++. Zatiaľ čo v Jave sú všetky funkcie štandardne brané ako virtuálne.

Pravidlo č. 11

Prepísanie metódy sa líši od preťaženia metódy, pretože ide o proces runtime polymorfizmu, zatiaľ čo preťaženie a metóda sú príkladom polymorfizmu kompilácie. V prípade prepísania metódy je nevyhnutné zachovať rovnaký podpis metódy. keď urobíme akúkoľvek zmenu v spôsobe vrátenia typu alebo zoznamu parametrov, kompilátor to považuje za preťaženie metódy.

Prepísanie metódy Metóda Preťaženie
class A(
public void test()(
System.out.println("In class A");
)
)
class B extends A(
public void test()(
System.out.println("In class A");
))public class Test(
public static void main(String() args)(
A a=new B();
a.test();
A b =new A();
b.test();
))
class A(
public void test()(
System.out.println("Method without arguments");
)
public void test(int x)(
System.out.println("Method with arguments");
System.out.println(x);
))public class Test(
public static void main(String() args)(
A a=new A();
a.test();
a.test(2);
)
)

Výkon:

Kedy použiť metódu Overriding?

Nasledujú spôsoby použitia funkcie Overriding:

  • OOP poskytuje skvelú vlastnosť dedičstva a vytvára veľkú hierarchiu medzi nadtriedou a podtriedou od menšej špecializácie po väčšiu špecializáciu.
  • Môžeme použiť nadtriedu na vytvorenie rámca, ktorý sa dá zdediť vo všetkých jej podtriedach a podtriedach, a môžeme definovať rôzne fungovanie týchto metód. To sa dosiahne prvoradou vlastnosťou, pri ktorej sa môže zdedeným metódam poskytnúť podskupinu špecializované fungovanie.
  • Pomáha tiež poskytovať rámec pre viac tried poskytovaním kolekcie premenných a metódy, ktorá sa musí implementovať do všetkých jej podtried.

záver

OOP, koncepty robia kód robustným a ľahko použiteľným, keď sa používajú efektívne. Prvoradá funkcia vylepšuje použitie dedičstva na zabezpečenie špecifickej implementácie generickej metódy nadradenej triedy v jej podtriedach. Toto používa koncepciu runtime polymorfizmu na spustenie správnej definície metódy. Dynamické odosielanie metód sa vykonáva iba za behu, ktorý kontroluje odkaz triedy, ktorú objekt drží, aby zavolal metódu. Táto funkcia sa riadi rôznymi pravidlami a nevzťahuje sa na statické metódy. Môžeme implementovať prepísanie metód v akomkoľvek objektovo orientovanom jazyku a urobiť náš program rýchlejším a robustnejším.

Odporúčané články

Toto je príručka pre Overriding in OOPs. Tu diskutujeme o tom, ako prevažuje práca v OOP, kedy sa používa, a 11 pravidiel s kódmi a výstupmi. Viac informácií nájdete aj v ďalších súvisiacich článkoch.

  1. Prevažovanie v PHP
  2. Prepísanie v jazyku JavaScript
  3. Čo je OOP?
  4. Prepísanie metódy v jazyku C #
  5. Príklady prepísania v jazyku Java
  6. Statická metóda JavaScript Ako pracovať s príkladmi

Kategórie: