Porovnávacia tabuľka
Základ pre porovnanie | Rozhranie | Abstraktná 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ódy | Rozhranie obsahuje iba abstraktné metódy. | Abstraktná trieda obsahuje abstraktné metódy, ako aj konkrétne metódy. |
Modifikátor prístupu metód | Metó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ódy | Metó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ých | Prí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ých | Premenné rozhrania sa musia inicializovať v čase deklarovania. | Nie je povinné, aby abstraktné triedkové premenné boli inicializované v čase deklarovania. |
Instance a statické bloky | Vnútorné rozhranie nemôžete deklarovať inštanciu alebo statický blok. | Abstraktná trieda umožňuje inštanciu alebo statický blok v nej. |
konštruktéri | Konš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 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 #
- 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.
- Rozhranie má všetky svoje metódy abstraktné, ale abstraktná trieda má niektoré abstraktné metódy a niektoré konkrétne metódy.
- 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é.
- 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.
- 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é.
- Premenné v rozhraní nemôžu byť nikdy súkromne chránené prechodné alebo volatilné, zatiaľ čo v abstraktnej triede neexistujú žiadne obmedzenia pre premenné.
- Premenná rozhrania sa musí inicializovať počas deklarovania. Na druhej strane môžu byť premenné v abstraktnej triede kedykoľvek iniciované.
- Vo vnútri rozhrania nemožno deklarovať inštanciu alebo statický blok, ale môžete uviesť inštanciu alebo statický blok v abstraktnej triede.
- 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.