Összehasonlító táblázat
Az összehasonlítás alapja | Felület | Absztrakt osztály |
---|---|---|
Alapvető | Ha nem csak a megvalósítással kapcsolatos ismeretekkel rendelkezik, akkor az "Interfész" -et használja. | Amikor részlegesen ismeri az „Elvont osztályok” alkalmazást. |
Mód | Az interfész csak absztrakt módszereket tartalmaz. | Az absztrakt osztály absztrakt módszereket és konkrét módszereket tartalmaz. |
A módszerek hozzáférési módosítója | Az interfész módszerek mindig "nyilvános" és "absztrakt", még akkor is, ha nem nyilatkozunk. Ezért 100% -os, tiszta absztrakt osztálynak mondható. | Nem kötelező, hogy az elvont osztályban a módszer nyilvános és absztrakt lesz. Konkrét módszerekkel is rendelkezhet. |
Korlátozott módszerek módosítása | Egy interfész módszer nem deklarálható az alábbi módosítókkal: Nyilvános: magán és védett Absztrakt: végleges, statikus, szinkronizált, natív, szigorú. | Az absztrakt osztályváltozó módosítóinak nincsenek korlátozásai. |
A változók módosítása | Az Interess változók számára engedélyezett Acess Modifier nyilvános, statikus és végleges, függetlenül attól, hogy nyilatkozunk-e vagy sem. | Az elvont osztályban szereplő változóknak nem kell nyilvánosnak, statikusnak, véglegesnek lennie. |
Korlátozott változók változókhoz | Az interfészváltozókat nem lehet magán, védett, átmeneti, illékony. | Az absztrakt osztályváltozók módosítóinak nincs korlátozása. |
A változók inicializálása | Az interfészváltozókat a nyilatkozat időpontjában kell inicializálni. | Nem kötelező, hogy az absztrakt osztályváltozókat a nyilatkozat időpontjában inicializálni kell. |
Példa és statikus blokkok | A belső felületen nem lehet egy példányt vagy statikus blokkot bejelenteni. | Az absztrakt osztály lehetővé teszi egy példány vagy statikus blokk belsejében. |
Constructors | A konstruktor belső felületét nem tudja bejelenteni. | A konstruktort elvont osztályon belül lehet bejelenteni. |
Az interfész meghatározása
A Java nem engedélyezi a többszörös öröklést. Ez azt jelenti, hogy egyetlen osztály nem egyszerre több osztályt örökölhet. Ennek oka egy példával magyarázható. Tételezzük fel, hogy két szülőosztályunk van: A és B, és egy származtatott C osztály. A származtatott C osztály örökli mind az A, mind a B osztályt. Most mindkettőnek van A és B osztálya (), akkor kérdés lesz a C osztályhoz, hogy melyik osztály által meghatározott () módszert kell örökölnie. A probléma megoldása „interfész”.
access_specifier interfész interfész_neve {visszatérő típusú módszer-név1 (paraméter-lista); visszatérési típusú módszernév2 (paraméter-lista); típusú végleges varname1 = érték; típusú végleges varname2 = érték; // ... visszatérő típusú metódusnévN (paraméter-lista); típusú végleges-varnameN = érték; }
A hozzáférési specifikátort nyilvánosságra hozzák, mert az osztályoknak végre kell hajtaniuk az interfészt.
C ++-ban nincs „Interface” fogalma. De a Java és a C # határozza meg a felületet.
Interfész Java-ban:
- Az interfész változói alapértelmezés szerint mindig nyilvánosak, statikusak és véglegesek.
- A változókat a nyilatkozat időpontjában kell inicializálni.
- A változókat soha nem lehet magán, védett, átmeneti és illékonynak nyilvánítani.
- Az interfész módszerei mindig nyilvánosak és elvontak, míg soha nem lehetnek magán, védett, végleges, statikus, szinkronizált, natív és szigorúak.
- Nem adhat ki konstruktor belső felületet, mivel a konstruktor fő célja az osztályváltozók inicializálása, de az interfészváltozókban a deklaráció idején inicializálják.
- Az interfész örökölhet más interfészeket, de az ilyen interfészt végrehajtó osztálynak végre kell hajtania az öröklött interfészek összes módját.
- Egy osztály egyidejűleg több felületet is örökíthet, és az összes öröklött interfész összes módját végre kell hajtania.
Az interfész általános megvalósítási formája Java-ban:
class class_name implementálja az Interface_name {// class-body}
Egy felület örökölésére egy osztály kulcsszó „implementál” -ot használ, és az osztály minden örökölt felület által bejelentett módszert végrehajt.
Interfész C #:
A C # interfész majdnem hasonló a Java felülethez, kivéve:
- A C # interfész nem jelez változókat.
- A kezelőfelület neve egy fővárossal van ellátva, és egy kettőspont (:) jelzéssel öröklődik.
Az interfész általános megvalósítási formája C #:
class class_name: interface_name {// class-body}
Az absztrakt osztály meghatározása
Egy osztályt, amely egy vagy több absztrakt módszert tartalmaz, elvont osztálynak nevezzük, és az osztályot elvontnak adják ki az „absztrakt” kulcsszó segítségével, amelyet az osztálynyilatkozat elején az „osztály” kulcsszó követ. Mivel az absztrakt osztály az absztrakt módszert tartalmazza, nem teljes típusnak minősül. Ezért nem hozhat létre absztrakt osztályú objektumokat. Ha egy osztály örökli egy absztrakt osztályt, akkor az absztrakt osztály minden elvont módját végre kell hajtania, ha nem, akkor azt is absztraktnak kell nyilvánítani. Az absztrakt attribútum öröklődik mindaddig, amíg az absztrakt módszerek teljes megvalósítása meg nem történik.
Az elvont osztály konkrét módszereket is tartalmazhat, amelyeket a származtatott osztály felhasználhat. De az absztrakt osztályban nem lehet absztrakt konstruktort vagy absztrakt statikus módszert kimondani. Az absztrakt osztály általános formája a Java-ban:
absztrakt osztályosztálynév {elvont módszer_név1 (); absztrakt módszer_név2 (); : return_type method_name3 (paraméter_list) {// konkrét módszer} return_type method_name4 (paraméter_list) {// konkrét módszer}};
Az elvont osztály fogalma a Java és a C # egyaránt hasonló. Egy absztrakt osztály kissé eltér a C ++ -tól.
C ++-ban, ha az osztály legalább egy virtuális funkcióval rendelkezik, az osztály absztrakt osztálysá válik. Az „absztrakt” kulcsszó helyett a „virtuális” kulcsszó egy absztrakt módszer bejelentésére szolgál.
A Java és C # interfész és az absztrakt osztály közötti különbségek
- Ha megvan a „szükséges” tudás, de nem a „hogyan kell végrehajtani”, akkor az interfészt kell használni. Másrészről, ha tudod, hogy mi szükséges és részlegesen tudja, hogyan valósítható meg, akkor használj egy absztrakt osztályt.
- Az interfésznek minden módszere absztrakt, de az elvont osztálynak van néhány absztrakt módszere és néhány konkrét módszere.
- Az interfészen belüli módszerek nyilvánosak és elvontak, ezért tiszta absztrakt osztálynak is nevezik. Másrészt, az elvont elveken belüli módszerek nem korlátozódnak csak nyilvános és elvontakra.
- Egy interfész módszer soha nem lehet privát, védett, végleges, statikus, szinkronizált, natív vagy szigorú. Másrészt, nincsenek korlátozások az elvont osztály módszereire.
- Egy interfész változói nyilvánosak és véglegesek, függetlenül attól, hogy deklaráljuk-e őket, vagy sem, míg az elvont osztály változóinak ilyen korlátozása nem csak nyilvános és végleges.
- Egy interfész változói soha nem lehetnek privát védett tranziens vagy illékonyak, míg az elvont osztályban a változókra nincs korlátozás.
- Az interfész változóját a deklaráció során inicializálni kell. Másrészről az elvont osztály változói bármikor inicializálhatók.
- Egy interfészen belül egy példányt vagy statikus blokkot nem lehet bejelenteni, de az absztrakt osztályon belül bejelenti a példányt vagy a statikus blokkot.
- Nem adhat meg egy konstruktort az interfészen belül, míg a konstruktort elvont osztályban határozhatja meg.
Következtetés:
Ha olyan alaposztályt kell létrehoznunk, amely egy általánosított módszert tartalmaz, amelyet a származtatott osztályok igényeik szerint valósíthatnak meg, akkor az interfész és az absztrakt osztály fogalma segít.