a polimorfizmus szót különböző kontextusokban használják, és leírja azokat a helyzeteket, amelyekben valami több különböző formában fordul elő. A számítástechnikában leírja azt a koncepciót, hogy különböző típusú objektumok ugyanazon a felületen keresztül érhetők el. Minden típus biztosítja a felület saját, független megvalósítását. Ez az objektumorientált programozás (OOP) egyik alapfogalma.,
Ha kíváncsi, hogy egy objektum polimorf-e, egyszerű tesztet végezhet. Ha az objektum sikeresen átmegy több is-a vagy instanceof tesztek, ez polimorf. Amint azt az öröklésről szóló bejegyzésben leírtam, az összes Java osztály kiterjeszti az osztályobjektumot. Ennek köszönhetően a Java összes objektuma polimorf, mert legalább két ellenőrzést végez.,
a Különböző típusú polimorfizmus
támogatja a Java 2 típusú polimorfizmus:
- statikus vagy compile-time
- dinamikus
Statikus polimorfizmus
Java, mint sok más objektum-orientált programozási nyelvek, lehetővé teszi, hogy végre több módszerek belül az azonos osztályú, hogy használhatja ugyanazt a nevet, de más-más paramétereket. Ezt nevezik módszertúlterhelésnek, és a polimorfizmus statikus formáját képviseli.,
a paraméterkészleteknek a következő három kritérium legalább egyikében különbözniük kell:
- eltérő számú paraméterre van szükségük, például az egyik módszer 2, a másik pedig 3 paramétert fogad el.
- a paraméterek típusának különbözőnek kell lennie, például az egyik módszer elfogadja a karakterláncot, a másik pedig hosszú.
- eltérő sorrendben kell várniuk a paramétereket, pl. egy metódus egy stringet, egy hosszú, egy másik pedig egy hosszú és egy stringet fogad el. Ez a fajta túlterhelés nem ajánlott, mert megnehezíti az API megértését.,
a legtöbb esetben mindegyik túlterhelt módszer más, de nagyon hasonló funkciót biztosít.
a különböző paraméterkészletek miatt minden módszer eltérő aláírással rendelkezik. Ez lehetővé teszi a fordító számára, hogy azonosítsa, melyik módszert kell hívni, és összekapcsolja azt a módszerhívással. Ezt a megközelítést statikus kötésnek vagy statikus polimorfizmusnak nevezik.
vessünk egy pillantást egy példára.
egy egyszerű példa a statikus polimorfizmusra
ugyanazt a CoffeeMachine projektet használom,mint a sorozat korábbi hozzászólásaiban. Klónozhatja a https://github.com/thjanssen/Stackify-OopInheritancecímen.,
a BasicCoffeeMachine osztály két módszert valósít meg a brewCoffee névvel. Az első egy CoffeeSelection típusú paramétert fogad el. A másik módszer két paramétert, egy Kávétkiválasztást, valamint egy int-t fogad el.
Most, amikor ezen módszerek egyikét hívja, a megadott paraméterkészlet azonosítja azt a módszert, amelyet meg kell hívni.
a következő kódrészletben csak a CoffeeSelection objektummal hívom a módszert. Fordításkor a Java fordító ezt a metódushívást a brewCoffee(CoffeeSelection selection) metódushoz köti.,
BasicCoffeeMachine coffeeMachine = createCoffeeMachine();coffeeMachine.brewCoffee(CoffeeSelection.FILTER_COFFEE);
ha megváltoztatom ezt a kódot, és a brewCoffee metódust CoffeeSelection objektummal és int-vel hívom, a fordító a metódushívást a másik brewCoffee(CoffeeSelection selection, int number) metódushoz köti.
dinamikus polimorfizmus
a polimorfizmus ezen formája nem teszi lehetővé a fordító számára a végrehajtott módszer meghatározását. A JVM-nek futásidőben kell ezt tennie.
egy öröklési hierarchián belül egy alosztály felülírhatja a szuperosztály módszerét. Ez lehetővé teszi az alosztály fejlesztőjének, hogy testreszabja vagy teljesen kicserélje a módszer viselkedését.,
a polimorfizmus egy formáját is létrehozza. Mindkét, a szuper – és alosztály által implementált módszer azonos nevet és paramétereket tartalmaz, de eltérő funkcionalitást biztosít.
vessünk egy pillantást egy másik példára a CoffeeMachine projektből.
az öröklési hierarchiában felülírott módszer
a Basiccoffeemachine osztály a PremiumCoffeeMachine osztály szuperosztálya.
mindkét osztály biztosítja a brewCoffee(CoffeeSelection selection) módszer végrehajtását.,
ha elolvassa az OOP koncepció örökléséről szóló bejegyzést, akkor már ismeri a brewCoffee módszer két megvalósítását. A BasicCoffeeMachine csak támogatja a Kávétkiválasztás.FILTER_COFFEE. A premiumcoffeemachine osztály brewCoffee módszere támogatja a Coffeeselectiont.Eszpresszó. Ha bármilyen más CoffeeSelection-rel hívják, akkor a Super kulcsszót használja a hívás delegálásához a superclass-hez.,
késői kötés
ha ilyen öröklési hierarchiát szeretne használni a projektben, akkor képesnek kell lennie arra, hogy válaszoljon a következő kérdésre: melyik módszert hívja a JVM?
amit csak futásidőben lehet megválaszolni, mert attól függ, hogy melyik objektumra hívják a módszert. A Hivatkozás típusa, amelyet a kódban láthat, irreleváns. Meg kell különböztetni a három általános forgatókönyvet:
- az objektum a superclass típusú lesz hivatkozni, mint a superclass., Tehát ennek a bejegyzésnek a példájában egy BasicCoffeeMachine objektumot hivatkoznak BasicCoffeeMachine-ként.
- az objektum az alosztály típusához tartozik, és alosztályként hivatkoznak rá. A példában ezt a bejegyzést, PremiumCoffeeMachine objektum lesz hivatkozni, mint egy PremiumCoffeeMachine.
- az objektum az alosztály típusához tartozik, és szuperosztályként hivatkoznak rá. A CoffeeMachine példa, PremiumCoffeeMachine objektum lesz hivatkoznak, mint egy BasicCoffeeMachine.
Superclass hivatkozni, mint a superclass
az első forgatókönyv nagyon egyszerű., Ha egy BasicCoffeeMachine objektumot instantálsz, és egy BasicCoffeeMachine típusú változóban tárolod, a JVM a brewCoffee módszert fogja hívni a BasicCoffeeMachine osztályban. Tehát csak kávét főzhetkiválasztás.FILTER_COFFEE.
alosztály hivatkoznak az alosztály
a második forgatókönyv hasonló. De ezúttal bemutatok egy PremiumCoffeeMachine-t, és PremiumCoffeeMachine-ként hivatkozom rá. Ebben az esetben a JVM a PremiumCoffeeMachine osztály brewCoffee módszerét hívja fel, amely támogatja a Kávéválasztást.Eszpresszó.,
a szuperosztályként hivatkozott alosztály
Ez a legérdekesebb forgatókönyv, és a fő ok, amiért ilyen részletekben magyarázom a dinamikus polimorfizmust.
amikor egy PremiumCoffeeMachine objektumot instantálsz és hozzárendeled a BasicCoffeeMachine coffeeMachine változóhoz, akkor is egy PremiumCoffeeMachine objektum. Csak úgy néz ki, mint egy Alapkoffeemachine.
a fordító nem látja ezt a kódban, csak a BasicCoffeeMachine osztály által biztosított módszereket használhatja., De ha a brewcoffee módszert a coffeeMachine változóra hívjuk, a JVM tudja, hogy ez egy PremiumCoffeeMachine típusú objektum, és végrehajtja a felülbírált módszert. Ezt késői kötésnek nevezik.
összefoglaló
a polimorfizmus az OOP nyelvek egyik alapfogalma. Leírja azt a koncepciót, hogy különböző osztályok használhatók ugyanazzal a felülettel. Ezen osztályok mindegyike biztosítja a felület saját megvalósítását.
A Java kétféle polimorfizmust támogat. Túlterhelhet egy módszert különböző paraméterkészletekkel., Ezt statikus polimorfizmusnak nevezik, mivel a fordító statikusan kötődik a módszerhíváshoz egy adott módszerhez.
egy öröklési hierarchián belül egy alosztály felülírhatja a szuperosztály módszerét. Ha példányosítja az alosztályt, a JVM mindig a felülbírált módszert fogja hívni, még akkor is, ha az alosztályt a szuperosztályába helyezi. Ezt dinamikus polimorfizmusnak nevezik.