A Java egy objektum-orientált programozási nyelv, amely lehetővé teszi a fejlesztők számára összetett szoftverrendszerek létrehozását. A Java egyik kulcsfontosságú jellemzője az öröklődés, amely lehetővé teszi az osztályok számára, hogy más osztályoktól örököljenek tulajdonságokat és metódusokat. A Java-ban egy osztály egyszerre csak egy szülőosztályt tud kiterjeszteni, de interfészek használatával többféle öröklődéshez hasonló viselkedés érhető el. Ebben a cikkben megvizsgáljuk, hogyan bővíthetünk ki több osztályt a Java nyelven, és hogyan biztosíthatunk példaprogramokat kimenettel.
Több osztály kiterjesztése Java-ban
A Java nem teszi lehetővé, hogy egy osztály közvetlenül több osztályt bővítsen. Ennek az az oka, hogy elkerüljük a gyémánt problémát, amely akkor fordul elő, ha egy osztály két olyan osztályból örököl, amelyeknek közös szuperosztálya van. A probléma elkerülése érdekében a Java lehetővé teszi egy osztály számára, hogy több interfészt implementáljon, amelyek hasonló funkcionalitást érhetnek el.
Az interfész absztrakt metódusok gyűjteménye, amelyek meghatározzák egy osztály viselkedését. Az osztályokkal ellentétben az interfészek nem példányosíthatók, de osztályonként megvalósíthatók. Egy interfész megvalósításával egy osztály több interfész tulajdonságait és metódusait is örökölheti. Lehetővé teszi egy osztály számára, hogy többszörös öröklődésszerű viselkedést érjen el a gyémánt probléma nélkül. Több osztály kiterjesztéséhez Java-ban létre kell hoznunk egy felületet, amely tartalmazza a szülőosztályok tulajdonságait és metódusait. A megvalósító osztály ezután megvalósíthatja az interfészt, és örökölheti a szülőosztályok tulajdonságait és metódusait. Vessünk egy példát, hogy jobban megértsük ezt a fogalmat.
jvm java-ban
Több osztály kiterjesztése Java-ban
Ebben a példában három osztályt fogunk létrehozni: Állat, Emlős és Hüllő. Ezután létrehozunk egy Omnivore nevű felületet, amely kiterjeszti az Animal és Mammal osztályokat. Végül létrehozunk egy Platypus nevű osztályt, amely megvalósítja az Omnivore felületet.
Az Animal osztály tartalmazni fog egy 'eat' nevű metódust, amely az 'Animal is eat' szöveget írja ki. Az emlős osztály kibővíti az Animal osztályt, és tartalmazni fogja a „drinkMilk” nevű módszert, amely a következőt írja ki: „Mammal is is drink milk”. A Reptile osztály kibővíti az Animal osztályt is, és tartalmaz egy 'layEggs' nevű metódust, amely a 'Reptile is laying eggs' szöveget írja ki.
Itt van az Animal osztály kódja:
ingyenes vs ingyenes
public class Animal { public void eat() { System.out.println('Animal is eating.'); } }
Íme az Emlős osztály kódja:
public class Mammal extends Animal { public void drinkMilk() { System.out.println('Mammal is drinking milk.'); } }
Itt van a Reptile osztály kódja:
public class Reptile extends Animal { public void layEggs() { System.out.println('Reptile is laying eggs.'); } }
Most hozzuk létre az Omnivore felületet, amely kiterjeszti az Állat és Emlős osztályokat:
public interface Omnivore extends Animal, Mammal { public void eatPlants(); }
Végül hozzuk létre a Platypus osztályt, amely megvalósítja az Omnivore felületet:
public class Platypus implements Omnivore { public void eat() { System.out.println('Platypus is eating.'); } public void drinkMilk() { System.out.println('Platypus is drinking milk.'); } public void eatPlants() { System.out.println('Platypus is eating plants.'); } }
Ebben a példában a Platypus osztály az Omnivore interfészt valósítja meg, amely kiterjeszti az Animal és Mammal osztályokat. Ezért a Platypus osztály örökli mind az állatok, mind az emlős osztály tulajdonságait és módszereit.
Teszteljük programunkat úgy, hogy létrehozunk egy példányt a Platypus osztályból, és meghívjuk a metódusait:
public class Main { public static void main(String[] args) { Platypus p = new Platypus(); p.eat(); p.drinkMilk(); p.eatPlants(); } }
Kimenet:
prímszám java-ban
Platypus is eating. Platypus is drinking milk. Platypus is eating plants.
Amint látjuk, a Platypus osztály mind az Animal, mind a Mammal osztály tulajdonságait és metódusait képes örökölni az Omnivore interfész megvalósításával. Ez lehetővé teszi számunkra, hogy többszörös öröklődésszerű viselkedést érjünk el a Java-ban.
Mikor használjunk többszörös öröklődéshez hasonló viselkedést a Java-ban
Bár interfészek segítségével többféle öröklődésszerű viselkedést is el lehet érni a Java-ban, ez nem mindig szükséges vagy kívánatos. Valójában sok fejlesztő azzal érvel, hogy a többszörös öröklődés bonyolultabbá és nehezebben karbantarthatóvá teheti a kódot. Ezért fontos alaposan átgondolni, hogy szükség van-e többszörös öröklődéshez hasonló viselkedésre a programban.
Az egyik olyan helyzet, amikor a többszörös öröklődéshez hasonló viselkedés hasznos lehet, amikor több forrásból származó funkciókat kell kombinálnia. Ha például két olyan osztálya van, amelyek különböző típusú funkcionalitást biztosítanak, érdemes kombinálni őket egyetlen osztályba, amely mindkettőből örökli. Ebben az esetben jó megoldás lehet egy olyan interfész megvalósítása, amely mindkét osztályt kiterjeszti. Egy másik szituáció, amikor a többszörös öröklődéshez hasonló viselkedés hasznos lehet, az az, amikor harmadik féltől származó könyvtárakkal dolgozik, amelyek széles körben használják az öröklődést. Ha több harmadik féltől származó osztályt kell kibővítenie, az interfészek megvalósítása jó módja lehet ennek eléréséhez bonyolult öröklési hierarchiák létrehozása nélkül.
Java-ban nem lehetséges több osztályt közvetlenül kiterjeszteni. Több osztályt kiterjesztő interfészek megvalósításával azonban többféle öröklődéshez hasonló viselkedés érhető el. Ez lehetővé teszi egy osztály számára, hogy több szülőosztálytól örököljön tulajdonságokat és metódusokat, anélkül, hogy a gyémánt probléma merülne fel, amely közvetlen többszörös öröklődés esetén merülhet fel. Míg a többszörös öröklődéshez hasonló viselkedés bizonyos helyzetekben hasznos lehet, fontos alaposan fontolóra venni, hogy szükséges-e ez a program számára. Sok esetben az interfészek és a kompozíció használata jobb megoldás lehet a több forrásból származó funkcionalitás kombinálására.