Primerjalna tabela
Podlaga za primerjavo | Vmesnik | Abstraktni razred |
---|---|---|
Osnovno | Ko poznate samo zahteve, ki ne zadevajo njegovega izvajanja, uporabite "Vmesnik". | Ko delno veste o izvedbah, uporabite "Abstraktni razredi". |
Metode | Vmesnik vsebuje le abstraktne metode. | Abstraktni razred vsebuje abstraktne metode in konkretne metode. |
Modifikator dostopa za metode | Metode vmesnika so vedno "javne" in "abstraktne", tudi če jih ne prijavimo. Zato lahko rečemo, da je to 100% čisti abstraktni razred. | Ni obvezno, da bo metoda v abstraktnem razredu javna in abstraktna. Lahko ima tudi konkretne metode. |
Omejeni modifikator za metode | Metode vmesnika ni mogoče prijaviti z naslednjimi modifikatorji: Javno: zasebno in zaščiteno Povzetek: končna, statična, sinhronizirana, domača, strog. | Ni omejitev za modifikatorje abstraktne spremenljivke razreda. |
Modifikator spremenljivk za dostop | Dopustni modifikator dostopa za spremenljivke vmesnika so javni, statični in končni, ali se prijavljamo ali ne. | Spremenljivke v abstraktnem razredu ne smejo biti javne, statične, končne. |
Omejeni modifikatorji za spremenljivke | Vmesniških spremenljivk ni mogoče razglasiti za zasebne, zaščitene, prehodne, spremenljive. | Ni omejitev za modifikatorje abstraktnih spremenljivk razreda. |
Inicializacija spremenljivk | Spremenljivke vmesnika je treba inicializirati v času njegove deklaracije. | Ni nujno, da je treba abstraktne spremenljivke razreda inicializirati v času njegove izjave. |
Primerki in statični bloki | Znotraj vmesnika ne morete razglasiti primera ali statičnega bloka. | Abstraktni razred omogoča primerek ali statični blok znotraj njega. |
Konstruktorji | Vmesnika konstruktorja ne morete razglasiti. | Konstruktor lahko razglasite znotraj abstraktnega razreda. |
Opredelitev vmesnika
Java ne dovoljuje več dedovanja. To pomeni, da en razred ne more podedovati več kot en razred naenkrat. Razlog za to lahko pojasnimo s primerom. Predpostavimo, da imamo dva nadrejena razreda, A in B in izpeljani razred C. Izvedeni razred C podeduje oba razreda A in B. Tako imata oba razreda A in B nabor metod (), potem je vprašanje za razred C, katera metoda razreda () (ali) ga mora podedovati. Rešitev tega problema je »vmesnik«.
access_specifier vmesnik ime_vmesnika {vrnitvena-metoda-ime1 (seznam parametrov); return-type method-name2 (seznam parametrov); tip final-varname1 = vrednost; tip final-varname2 = vrednost; // ... vrnejo metodo-imeN (seznam parametrov); tip final-varnameN = vrednost; }
Specifikator dostopa je razglašen za javnega, ker morajo razreda uvesti vmesnik.
V C ++ nimamo koncepta "Interface". Vendar pa Java in C # zelo dobro določata vmesnik.
Vmesnik v Javi:
- Spremenljivke vmesnika so privzeto vedno javne, statične in končne.
- Spremenljivke je treba inicializirati ob njeni izjavi.
- Spremenljivke nikoli ne moremo razglasiti za zasebne, zaščitene, prehodne in volatilne.
- Metode vmesnika so vedno javne in abstraktne, medtem ko jih nikoli ne moremo razglasiti za zasebne, zaščitene, končne, statične, sinhronizirane, domače in stroge.
- Ne morete razglasiti nobenega konstruktorja znotraj vmesnika, saj je glavni namen konstruktorja inicializacija spremenljivk razreda, vendar se v vmesniških spremenljivkah inicializirajo v času njegove deklaracije.
- Vmesnik lahko podeduje druge vmesnike, vendar mora razred, ki izvaja tak vmesnik, uporabiti metode vseh podedovanih vmesnikov.
- Razred lahko podeduje več kot en vmesnik naenkrat in mora izvajati vse metode vseh podedovanih vmesnikov.
Splošna oblika izvajanja vmesnika v Javi:
class class_name implementira ime_vmesnika {// class-body}
Za podedovanje vmesnika razred uporablja ključno besedo »implementira« in razred izvaja vse metode, ki jih deklarira podedovani vmesnik.
Vmesnik v C #:
Vmesnik v C # je skoraj podoben vmesniku v Javi, razen:
- Vmesnik v C # ne deklarira spremenljivk.
- Ime vmesnika je označeno z glavno črko I in je podedovano z dvopičjem (:).
Splošna oblika izvajanja vmesnika v C #:
class class_name: ime_vmesnika {// class-body}
Opredelitev abstraktnega razreda
Razred, ki vsebuje eno ali več abstraktnih metod, se imenuje abstraktni razred, razred pa je razglašen kot abstrakten z uporabo ključne besede „abstrakt“, pred katero je na začetku deklaracije razreda beseda »class«. Ker abstraktni razred vsebuje abstraktno metodo, predstavlja nepopoln tip. Zato ne morete ustvarjati predmetov abstraktnega razreda. Kadar razred podeduje abstraktni razred, mora izvesti vse abstraktne metode abstraktnega razreda, če ne sledi, mora biti tudi razglašen kot abstrakten. Abstraktni atribut je podedovan, dokler ni dosežena popolna implementacija abstraktnih metod.
Abstraktni razred lahko vsebuje tudi konkretne metode, ki jih lahko uporabi izpeljani razred. Vendar pa v abstraktnem razredu ne morete razglasiti abstraktnega konstruktorja ali abstraktne statične metode. Splošna oblika abstraktnega razreda v Javi je naslednja:
abstraktni razred class_name {abstract method_name1 (); abstraktna metoda_ime2 (); : return_type method_name3 (parameter_list) {// konkretna metoda} return_type method_name4 (parameter_list) {// konkretna metoda}};
Koncept abstraktnega razreda je podoben v Java in C #. Abstraktni razred se v C ++ nekoliko razlikuje.
V C ++, če ima razred vsaj eno virtualno funkcijo, razred postane abstraktni razred. Namesto ključne besede »abstrakt« se za razglasitev abstraktne metode uporabi ključna beseda »virtual«.
Ključne razlike med vmesnikom in abstraktnim razredom v Javi in C #
- Ko imate znanje o tem, kaj se zahteva, vendar ne o tem, kako bi bilo izvedeno, je treba uporabiti vmesnik. Po drugi strani pa, če veste, kaj je zahtevano in delno veste, kako bi bilo izvedeno, uporabite abstraktni razred.
- Vmesnik ima vse svoje metode abstraktne, a abstraktni razred ima nekaj abstraktnih metod in nekaj konkretnih metod.
- Metode znotraj vmesnika so javne in abstraktne, zato se imenuje tudi čisti abstraktni razred. Po drugi strani pa metode znotraj povzetka niso omejene le na javno in abstraktno.
- Metoda vmesnika ne more nikoli biti zasebna, zaščitena, končna, statična, sinhronizirana, domača ali stroga. Po drugi strani pa ni nobenih omejitev za metode abstraktnega razreda.
- Spremenljivke v vmesniku so javne in končne, ne glede na to, ali jih deklariramo ali ne, ker takšne omejitve na spremenljivke abstraktnega razreda niso javne in končne.
- Spremenljivke v vmesniku ne smejo nikoli biti zasebno zaščitene, prehodne ali volatilne, medtem ko v abstraktnem razredu ni omejitev za spremenljivke.
- Spremenljivka vmesnika mora biti inicializirana med deklaracijo. Po drugi strani pa lahko spremenljivke v abstraktnem razredu kadarkoli inicializiramo.
- V notranjosti vmesnika ni mogoče deklarirati primerka ali statičnega bloka, lahko pa deklarirate primer ali statični blok znotraj abstraktnega razreda.
- V vmesniku ne morete definirati konstruktorja, medtem ko lahko konstruktor definirate znotraj abstraktnega razreda.
Sklep:
Če morate ustvariti osnovni razred, ki vsebuje posplošeno obliko metod, ki jih lahko izvajajo izpeljani razredi glede na njihovo potrebo, pomaga koncept vmesnika in abstraktnega razreda.