OOP koncepció kezdőknek: mi az öröklés?
az öröklés az objektumorientált programozási (OOP) nyelvek egyik alapfogalma. Ez egy olyan mechanizmus, ahol egy osztályt egy másik osztályból származtathatunk olyan osztályok hierarchiájához, amelyek egy sor attribútumot és módszert osztanak meg.
használhatja különféle kivételek deklarálására, egyéni logika hozzáadására a meglévő keretrendszerekhez, sőt a tartománymodellt egy adatbázisba is leképezheti.,
deklarálja az öröklési hierarchiát
Java-ban, minden osztály csak egy másik osztályból származhat. Ezt az osztályt szuperosztálynak vagy szülői osztálynak nevezik. A származtatott osztályt alosztálynak vagy gyermekosztálynak nevezik.
a kulcsszó kiterjed, hogy azonosítsa az osztály, hogy az alosztály kiterjed. Ha nem deklarál egy szuperosztályt, akkor az osztály implicit módon kiterjeszti az osztályobjektumot. Az objektum az összes öröklési hierarchia gyökere; ez az egyetlen osztály a Java-ban, amely nem hosszabbít meg egy másik osztályt.
az alábbi diagram és kódrészletek egy egyszerű öröklési hierarchia példáját mutatják.,
a class BasicCoffeeMachine nem deklarál egy szuperosztályt, és implicit módon kiterjeszti az osztályobjektumot. Klónozhatja a coffeemachine példa projektet a GitHub-on.
a PremiumCoffeeMachine osztály a BasicCoffeeMachine osztály alosztálya.
öröklési és hozzáférési módosítók
Az Access módosítók meghatározzák, hogy mely osztályok férhetnek hozzá egy attribútumhoz vagy módszerhez. Az egyik korábbi hozzászólás a kapszulázás, megmutattam, hogyan lehetne használni őket, hogy végre egy információ-elrejtő mechanizmus. De nem ez az egyetlen eset, amikor ismernie kell a különböző módosítókat., Ezek hatással vannak az öröklési hierarchiában elérhető entitásokra és attribútumokra is.
itt van egy gyors áttekintést a különböző módosítók:
- privát attribútumok vagy módszerek csak akkor érhető el ugyanabban az osztályban.
- A hozzáférési módosító nélküli attribútumok és módszerek ugyanazon osztályon belül, az összes többi osztály pedig ugyanazon csomagon belül érhetők el.
- a Védett attribútumok vagy módszerek ugyanazon osztályon belül, az ugyanazon csomagon belüli összes osztály, valamint az összes alosztály alapján érhetők el.,
- a nyilvános attribútumok és módszerek minden osztály számára elérhetők.
amint az a listában látható, egy alosztály hozzáférhet a szuperosztály összes védett és nyilvános attribútumához és módszeréhez. Ha az alosztály és a szuperosztály ugyanahhoz a csomaghoz tartozik, akkor az alosztály hozzáférhet a szuperosztály összes csomag-privát attribútumához és módszeréhez is.
ezt kétszer csinálom a PremiumCoffeeMachine osztály konstruktorában.
először a super kulcsszót használom a szuperosztály konstruktorának hívásához. A kivitelező Nyilvános, az alosztály pedig hozzáférhet., A Super kulcsszó a szuperosztályra utal. Használhatja egy attribútum eléréséhez, vagy meghívhatja a szuperosztály módszerét, amelyet az aktuális alosztály felülír. De erről bővebben a következő részben.
a védett attribútum configMap lesz által meghatározott BasicCoffeeMachine osztály. Az osztály kiterjesztésével az attribútum a PremiumCoffeeMachine osztály részévé is válik, és hozzá tudom adni azt a konfigurációt, amely egy eszpresszó elkészítéséhez szükséges.,
metódus felülírása
az öröklés nem csak a szuperosztály összes nyilvános és védett módszerét adja hozzá az alosztályhoz,hanem lehetővé teszi azok végrehajtását is. Az alosztály módszere ezután felülbírálja a szuperosztályt. Ezt a mechanizmust polimorfizmusnak nevezik.
ezt a PremiumCoffeeMachine osztályban használom a kávéfőző képességeinek kiterjesztésére. Az alapvető brewCoffee módszera coffeemachine módszer csak szűrheti a kávét.
felülbírálom ezt a módszert a PremiumCoffeeMachine osztályban a CoffeeSelection támogatásának hozzáadásához.,Eszpresszó. Amint az a kódrészletben látható, a szuper kulcsszó nagyon hasznos, ha felülír egy módszert. Az alap brewCoffee módszerea coffeemachine már kezeli a Kávétkiválasztást.FILTER_COFFEE és dob egy CoffeeException nem támogatott CoffeeSelections.
ezt újra felhasználhatom az új brewCoffee módszeremben. Ahelyett, hogy ugyanazt a logikát újragondolnám, csak ellenőrizném, hogy a Kávékiválasztás ESPRESSO-e. Ha nem ez a helyzet, a super kulcsszót használom a superclass brewCoffee módszerének hívására.,
megakadályozza a módszer felülírását
Ha meg akarja győződni arról, hogy egyetlen alosztály sem tudja megváltoztatni a módszer végrehajtását, akkor kijelentheti, hogy végleges. Ebben a bejegyzésben példa, tettem, hogy az addBeans módszer a BasicCoffeeMachine osztály.
gyakran jó ötlet, hogy minden módszer végleges legyen, amelyet egy konstruktor hív. Megakadályozza, hogy az alosztály gyakran véletlenül megváltoztassa a konstruktor viselkedését.,
egy alosztály szintén a szuperosztály típusához tartozik
egy alosztály nemcsak örökli a szuperosztály attribútumait és módszereit, hanem örökli a szuperosztály típusait is. A példában a BasicCoffeeMachine típusú BasicCoffeeMachine and Object. A PremiumCoffeeMachine objektum pedig a PremiumCoffeeMachine, BasicCoffeeMachine és Object típusokból áll.
emiatt, akkor leadott PremiumCoffeeMachine objektum írja BasicCoffeeMachine.
BasicCoffeeMachinee coffeeMachine = (BasicCoffeeMachine) PremiumCoffeeMachine(beans);
, amely lehetővé teszi a szuperosztályt használó kód írását, majd az összes alosztályt végrehajtja.,
ebben a példában a createCoffeeMachine metódus kódja visszatér, a makeCoffee metódus pedig a BasicCoffeeMachine osztályt használja. De a createCoffeeMachine módszer instantiates egy új PremiumCoffeeMachine objektum. Amikor a módszer visszaadja, az objektum automatikusan a BasicCoffeeMachine-re kerül, a kód pedig a BasicCoffeeMachine osztály összes nyilvános metódusát hívhatja.
a coffeeMachine objektum a BasicCoffeeMachine-hez kerül, de ez még mindig PremiumCoffeeMachine., Tehát amikor a makeCoffee módszer a brewCoffee metódust hívja, a PremiumCoffeeMachine osztályban a felülbírált módszert hívja.
absztrakt osztályok meghatározása
absztrakt osztályok különböznek a többi osztálytól, amelyekről beszéltünk. Meg lehet hosszabbítani, de nem példányosítva. Ez ideálissá teszi azokat a fogalmi általánosításokat, amelyek nem léteznek az adott domainben, de lehetővé teszik a kód egyes részeinek újrafelhasználását.
az absztrakt kulcsszót használja egy osztály vagy módszer absztrakt deklarálásához. Az absztrakt osztálynak nem kell absztrakt módszereket tartalmaznia., De egy absztrakt módszert absztrakt osztálynak kell deklarálnia.
finomítsuk meg a kávéfőző példáját, és vezessük be az AbstractCoffeeMachine osztályt a BasicCoffeeMachine osztály szuperosztályaként. Kijelentem, hogy az osztály elvont, és definiálom az absztrakt brewCoffee módszert.
public abstract class AbstractCoffeeMachine { protected Map<CoffeeSelection, Configuration> configMap; public AbstractCoffeeMachine() { this.configMap = new HashMap<CoffeeSelection, Configuration>(); } public abstract Coffee brewCoffee(CoffeeSelection selection) throws CoffeeException; }
mint látható, nem biztosítom az absztrakt brewCoffee módszer testét. Csak kijelentem, mint egy felületen., Az AbstractCoffeeMachine osztály kiterjesztésekor az alosztályt absztraktként kell definiálnia, vagy felül kell írnia a brewCoffee módszert a metódus test megvalósításához.
néhány kisebb változtatást hajtok végre a BasicCoffeeMachine osztályban. Most kiterjeszti az AbstractCoffeeMachine osztályt, a már létező brewCoffee módszer pedig felülírja a szuperosztály absztrakt módszerét.
egy másik dolog, amit megváltoztattam, a basiccoffeemachine osztály konstruktora. Most felhívja a superclass konstruktorát, majd hozzáad egy kulcs-érték párot a configMap attribútumhoz a térkép instantálása nélkül., Az absztrakt szuperosztály definiálja és utánozza, és minden alosztályban használható.
Ez az egyik fő különbség egy absztrakt szuperosztály és egy interfész között. Az absztrakt osztály nem csak a módszerek deklarálását teszi lehetővé, hanem olyan attribútumokat is definiálhat, amelyek nem statikusak és véglegesek.
összefoglaló
ahogy láttad, az öröklés egy erőteljes koncepció, amely lehetővé teszi egy olyan alosztály végrehajtását, amely kiterjeszti a szuperosztályt. Ezzel az alosztály örökli az összes védett és nyilvános attribútumot és módszert, valamint a szuperosztály típusát., Ezután használhatja a szuperosztály örökölt attribútumait, használhatja vagy felülbírálhatja az örökölt módszereket, majd az alosztályt bármilyen típusú szuperosztályra vetheti.
egy absztrakt osztály segítségével meghatározhat egy általános absztrakciót, amelyet nem lehet instantálni. Ebben az osztályban deklarálhatja az absztrakt módszereket, amelyeket nem absztrakt alosztályokkal kell felülbírálni. Ezt gyakran használják, ha a módszer végrehajtása minden alosztályra specifikus, de általános API-t szeretne meghatározni a hierarchia minden osztályához.