Odporúčaná, 2024

Redakcia Choice

Rozdiel medzi rozhraním a abstraktné triedy v jazyku Java a C #

Rozhranie a abstraktná trieda prispievajú k "neúplnému typu" v OOP. Niekedy potrebujeme nadtriedu, aby sme definovali "čo robiť", ale nie "ako robiť", tak ako to robiť časť bude implementovaná odvodenou triedou podľa jej potreby, " rozhranie " poskytuje riešenie. Niekedy potrebujeme triedu superclass, ktorá definuje nejakú všeobecnú štruktúru, ktorá môže byť implementovaná odvodenými triedami a určitou štruktúrou, ktorá môže byť využitá odvodenými triedami, " abstraktná trieda " poskytuje riešenie. Základný rozdiel medzi rozhraním a abstraktnou triedou spočíva v tom, že rozhranie je úplne neúplné a abstraktná trieda je čiastočne neúplná.

Porovnávacia tabuľka

Základ pre porovnanieRozhranieAbstraktná trieda
základnéKeď máte znalosti o požiadavkách len na ich implementáciu, používate rozhranie.Keď čiastočne viete o implementáciách, používate abstraktné triedy.
metódyRozhranie obsahuje iba abstraktné metódy.Abstraktná trieda obsahuje abstraktné metódy, ako aj konkrétne metódy.
Modifikátor prístupu metódMetódy rozhrania sú vždy "verejné" a "abstraktné", aj keď ich nehlásime. Preto môže byť povedané ako 100% čistá abstraktná trieda.Nie je povinné, aby metóda v abstraktnej triede bola verejná a abstraktná. Môže mať aj konkrétne metódy.
Obmedzený modifikátor pre metódyMetódu rozhrania nie je možné deklarovať s nasledujúcimi modifikátormi:
Verejné: súkromné ​​a chránené
Abstrakt: konečný, statický, synchronizovaný, natívny, striktný.
Neexistujú žiadne obmedzenia pre modifikátory premennej triedy abstraktov.
Modifikátor prístupu premennýchPrístupový modifikátor povolený pre premenné rozhrania sú verejné, statické a konečné, či už deklarujeme alebo nie.Premenné v abstraktnej triede nemusia byť verejné, statické, konečné.
Obmedzené modifikátory pre premennéPremenné rozhrania nie je možné označiť za súkromné, chránené, prechodné, nestále.Neexistujú žiadne obmedzenia pre modifikátory premenných triedy abstraktných.
Inicializácia premennýchPremenné rozhrania sa musia inicializovať v čase deklarovania.Nie je povinné, aby abstraktné triedkové premenné boli inicializované v čase deklarovania.
Instance a statické blokyVnútorné rozhranie nemôžete deklarovať inštanciu alebo statický blok.Abstraktná trieda umožňuje inštanciu alebo statický blok v nej.
konštruktériKonštruktor nemôžete deklarovať vo vnútri rozhrania.Môžete vyhlásiť konštruktéra do abstraktnej triedy.

Definícia rozhrania

Java nedovoľuje viacnásobné dedenie. To znamená, že jedna trieda nemôže zdediť viac ako jednu triedu naraz. Dôvodom toho môžeme vysvetliť príkladom. Predpokladajme, že máme dve materské triedy, A a B a odvodené triedy C. Odvodená trieda C zdedí obe triedy A a B. Teraz majú obe triedy A a B metódu nastavenú (), potom to bude otázka pre triedu C, ktorá metóda triedy by mala dediť (). Riešením tohto problému je "rozhranie".

Rozhranie je čisto abstraktná trieda. Kľúčové slovo používané na vytvorenie rozhrania je "rozhranie". Keďže všetky metódy v rozhraní sú úplne abstraktné. Rozhranie špecifikuje len to, čo trieda musí robiť, ale nedefinuje, ako to robí. Len preto, že všetky metódy deklarované vo vnútri rozhrania sú abstraktné, žiadna inštancia nie je vytvorená pre rozhranie. Všeobecná forma rozhrania v jave je:

 rozhranie access_specifier názov rozhrania {return-type method-name1 (parameter-list); return-type method-name2 (parameter-list); typ final-varname1 = hodnota; typ final-varname2 = hodnota; // ... return-type method-nameN (parameter-list); typ final-varnameN = hodnota; } 

Špecifikátor prístupu je vyhlásený za verejný, pretože triedy musia implementovať rozhranie.

Nemáme koncepciu rozhrania v jazyku C ++. Ale Java a C # definujú rozhranie veľmi dobre.

Rozhranie v jazyku Java:

  • Premenné rozhrania sú štandardne vždy verejné, statické a konečné.
  • Premenné sa musia iniciovať v čase vyhlásenia.
  • Premenné nemožno nikdy vyhlásiť za súkromné, chránené, prechodné a nestále.
  • Metódy rozhrania sú vždy verejné a abstraktné, zatiaľ čo ich nikdy nemožno vyhlásiť za súkromné, chránené, konečné, statické, synchronizované, natívne a striktné.
  • Nemôžete deklarovať žiadneho konštruktora vo vnútri rozhrania, pretože hlavným účelom konštruktora je inicializácia triednych premenných, ale v rozhraní sú premenné inicializované v čase deklarovania.
  • Rozhranie môže nadobudnúť iné rozhrania, ale trieda implementujúca takéto rozhranie musí implementovať metódy všetkých zdedených rozhraní.
  • Trieda môže zdediť viac ako jedno rozhranie naraz a musí implementovať všetky metódy všetkých zdedených rozhraní.

Všeobecná forma implementácie rozhrania v jazyku Java:

 class_name_name implementuje rozhranie_name {// class-body} 

Pri zdedení rozhrania trieda používa kľúčové slovo "implementuje" a trieda implementuje všetky metódy deklarované zdedeným rozhraním.

Rozhranie v C #:

Rozhranie v C # je takmer podobné rozhraniu v jazyku Java okrem:

  • Rozhranie v C # neurčuje premenné.
  • Názov rozhrania má predponu kapitálu I a je zdedený dvojbodkou (:).

Všeobecná forma implementácie rozhrania v C #:

 class_name_name: interface_name {// class-body} 

Definícia abstraktnej triedy

Trieda, ktorá obsahuje jednu alebo viac abstraktných metód, sa nazýva abstraktná trieda a trieda je deklarovaná ako abstraktná pomocou kľúčového slova "abstrakt", pred ktorým je kľúčové slovo "trieda" na začiatku deklarácie triedy. Abstraktná trieda obsahuje abstraktnú metódu, ktorú tvorí neúplný typ. Preto nemôžete vytvárať objekty abstraktnej triedy. Kedykoľvek trieda zdedí abstraktnú triedu, musí implementovať všetky abstraktné metódy abstraktnej triedy, ak to nie je, potom musí byť tiež deklarovaná ako abstraktná. Abstraktný atribút je dedičný, kým sa nedosiahne úplná implementácia abstraktných metód.

Abstraktná trieda môže obsahovať aj konkrétne metódy, ktoré môžu byť použité odvodenou triedou tak, ako je. Ale nemôžete uviesť abstraktnú konštrukciu alebo abstraktnú statickú metódu v abstraktnej triede. Všeobecná forma abstraktnej triedy v jazyku Java je nasledovná:

 abstraktná trieda class_name {abstract method_name1 (); abstraktné method_name2 (); : return_type method_name3 (parameter_list) {// konkrétna metóda} return_type method_name4 (parameter_list) {// concrete method}}; 

Koncept abstraktnej triedy je podobný ako v jazyku Java, tak v C #. Abstraktná trieda je v C ++ mierne odlišná.

V C ++, ak trieda má aspoň jednu virtuálnu funkciu, trieda sa stáva abstraktnou triedou. Namiesto kľúčového slova "abstrakt" sa na deklarovanie abstraktnej metódy používa kľúčové slovo "virtuálne".

Kľúčové rozdiely medzi rozhraním a abstraktnou triedou v jazyku Java a C #

  1. Keď máte vedomosti o tom, čo sa vyžaduje, ale nie o tom, ako to bude implementované, potom sa musí použiť rozhranie. Na druhej strane, ak viete, čo je potrebné a čiastočne vedieť, ako by sa implementovalo, použite abstraktnú triedu.
  2. Rozhranie má všetky svoje metódy abstraktné, ale abstraktná trieda má niektoré abstraktné metódy a niektoré konkrétne metódy.
  3. Metódy vo vnútri rozhrania sú verejné a abstraktné a preto sa nazývajú aj ako čistá abstraktná trieda. Na druhej strane metódy vo vnútri abstraktu nie sú obmedzené len na verejné a abstraktné.
  4. Metóda rozhrania nesmie byť nikdy súkromná, chránená, konečná, statická, synchronizovaná, natívna alebo striktná. Na druhej strane neexistujú žiadne obmedzenia pre metódy abstraktnej triedy.
  5. Premenné v rozhraní sú verejné a konečné, či už ich deklarujeme alebo nie, zatiaľ čo premenné abstraktnej triedy nie sú také obmedzené len na verejné a konečné.
  6. Premenné v rozhraní nemôžu byť nikdy súkromne chránené prechodné alebo volatilné, zatiaľ čo v abstraktnej triede neexistujú žiadne obmedzenia pre premenné.
  7. Premenná rozhrania sa musí inicializovať počas deklarovania. Na druhej strane môžu byť premenné v abstraktnej triede kedykoľvek iniciované.
  8. Vo vnútri rozhrania nemožno deklarovať inštanciu alebo statický blok, ale môžete uviesť inštanciu alebo statický blok v abstraktnej triede.
  9. Nemôžete definovať konštruktor vnútri rozhrania, zatiaľ čo môžete definovať konštruktora v abstraktnej triede.

záver:

Keď potrebujete vytvoriť základnú triedu, ktorá obsahuje zovšeobecnenú formu metód, ktoré môžu byť implementované odvodenými triedami podľa ich potrieb, pomôže to v koncepte rozhrania a abstraktnej triedy.

Top