CodeGym/Java blog/Véletlen/Polimorfizmus Java nyelven
John Squirrels
Szint
San Francisco

Polimorfizmus Java nyelven

Megjelent a csoportban
Szia! Ma az OOP alapelveiről szóló leckesorozatot zárjuk le. Ebben a leckében a Java polimorfizmusról fogunk beszélni. A polimorfizmus az a képesség, hogy több típussal úgy dolgozunk, mintha ugyanazok lennének. Ezenkívül az objektumok viselkedése típusuktól függően eltérő lesz. Nézzük meg közelebbről ezt a kijelentést. Kezdjük az első résszel: „az a képesség, hogy több típussal dolgozzunk úgy, mintha ugyanazok lennének”. Hogyan lehetnek egyformák a különböző típusok? Kicsit furcsán hangzik :/ A polimorfizmus használata - 1Valójában nagyon egyszerű az egész. Például ez a helyzet az öröklés szokásos használata során merül fel. Lássuk, hogyan működik ez. Tegyük fel, hogy van egy egyszerű Cat szülőosztályunk egyetlen run() metódussal:
public class Cat {

   public void run() {
       System.out.println("Run!");
   }
}
Most három osztályt hozunk létre, amelyek a macskát öröklik : Oroszlán , Tigris és Gepárd .
public class Lion extends Cat {

   @Override
   public void run() {
       System.out.println("Lion runs at 80 km/h");
   }
}

public class Tiger extends Cat {

   @Override
   public void run() {
       System.out.println("Tiger runs at 60 km/h");
   }
}

public class Cheetah extends Cat {

   @Override
   public void run() {
       System.out.println("Cheetah runs at up to 120 km/h");
   }
}
Tehát 3 osztályunk van. Modellezzük azt a helyzetet, amikor úgy dolgozhatunk velük, mintha egy osztályba tartoznának. Képzelje el, hogy az egyik macskánk beteg, és Dr. Dolittle segítségére van szüksége. Próbáljunk meg létrehozni egy Dolittle osztályt, amely képes meggyógyítani az oroszlánokat, tigriseket és gepárdokat.
public class Dolittle {

   public void healLion(Lion lion) {

       System.out.println("Lion is healthy!");
   }

   public void healTiger(Tiger tiger) {

       System.out.println("Tiger is healthy!");
   }

   public void healCheetah(Cheetah cheetah) {

       System.out.println("Cheetah is healthy!");
   }
}
Úgy tűnik, a probléma megoldódott: az óra meg van írva és indulásra kész. De mit tegyünk, ha meg akarjuk hosszabbítani programunkat? Jelenleg csak 3 típusunk van: oroszlánok, tigrisek és gepárdok. De több mint 40 fajta macska létezik a világon. Képzeld el, mi történne, ha külön osztályokat adnánk hozzá a manulokhoz, jaguárokhoz, Maine Coonokhoz, házi macskákhoz és az összes többihez. A polimorfizmus használata - 2Maga a program természetesen működni fog, de folyamatosan új módszerekkel kell kiegészítenünk a Dolittle osztályt, hogy minden macskatípust meggyógyítsunk. Ennek eredményeként soha nem látott méretűre nő. Itt jön képbe a polimorfizmus – „az a képesség, hogy több típussal dolgozzunk úgy, mintha ugyanazok lennének” –. Nem kell számtalan módszert létrehoznunk, hogy ugyanazt tegyük – meggyógyítsunk egy macskát. Egy módszer mindegyikhez elegendő:
public class Dolittle {

   public void healCat(Cat cat) {

       System.out.println("The patient is healthy!");
   }
}
A healCat() metódus képes elfogadni a Lion , Tiger és Cheetah objektumokat – ezek mind a Cat példányai :
public class Main {

   public static void main(String[] args) {

       Dolittle dolittle = new Dolittle();

       Lion simba = new Lion();
       Tiger shereKhan = new Tiger();
       Cheetah chester = new Cheetah();

       dolittle.healCat(simba);
       dolittle.healCat(shereKhan);
       dolittle.healCat(chester);
   }
}
Konzol kimenet: A beteg egészséges! A beteg egészséges! A beteg egészséges! Szóval a mi Dolittle-ünkosztály különböző típusokkal dolgozik, mintha ugyanazok lennének. Most pedig foglalkozzunk a második résszel: "sőt, az objektumok viselkedése típusuktól függően eltérő lesz". Minden nagyon egyszerű. A természetben minden macska másképp fut. Minimálisan különböző sebességgel futnak. Három macskafélénk közül a gepárd a leggyorsabb, míg a tigris és az oroszlán lassabban fut. Más szóval a viselkedésük más. A polimorfizmus többet tesz annál, mint hogy a különböző típusokat egyként használjuk. Azt is lehetővé teszi, hogy emlékezzünk a különbségeikre, megőrizve mindegyikük sajátos viselkedését. A következő példa ezt szemlélteti. Tegyük fel, hogy a macskáink a sikeres gyógyulás után úgy döntöttek, hogy élveznek egy kis futást. Ezt hozzáadjuk a Dolittle osztályunkhoz:
public class Dolittle {

   public void healCat(Cat cat) {

       System.out.println("The patient is healthy!");
       cat.run();
   }
}
Próbáljuk meg ugyanazt a kódot futtatni három állat kezelésére:
public static void main(String[] args) {

   Dolittle dolittle = new Dolittle();

   Lion simba = new Lion();
   Tiger shereKhan = new Tiger();
   Cheetah chester = new Cheetah();

   dolittle.healCat(simba);
   dolittle.healCat(shereKhan);
   dolittle.healCat(chester);
}
És így néz ki az eredmény: A beteg egészséges! Az oroszlán 80 km/h-val fut. A beteg egészséges! A Tigris 60 km/h-val fut. A beteg egészséges! A gepárd akár 120 km/h-val is fut Itt jól látható, hogy a tárgyak sajátos viselkedése megmarad, annak ellenére, hogy mindhárom állatot átadtuk a módszernek, miután „általánosítottuk” őket Cat . A polimorfizmus miatt Java jól emlékszik arra, hogy ezek nem egyszerűen három macska. Ők egy oroszlán, egy tigris és egy gepárd, amelyek mindegyike másként fut. Ez szemlélteti a polimorfizmus fő előnyét: a rugalmasságot. Amikor olyan funkciókat kell megvalósítanunk, amelyeken sok típus osztozik, akkor az oroszlánok, tigrisek és gepárdok egyszerűen „macskákká” válnak. Minden állat más, de bizonyos helyzetekben a macska macska, fajától függetlenül :) Íme néhány videó megerősítés.
Amikor ez az „általánosítás” nemkívánatos, és ehelyett minden fajnak másként kell viselkednie, minden típus megteszi a maga dolgát. A polimorfizmusnak köszönhetően egyetlen interfészt (metóduskészletet) hozhat létre az osztályok széles skálájához. Ez kevésbé bonyolulttá teszi a programokat. Még ha kibővítjük is a programot 40 fajta macska támogatására, akkor is a legegyszerűbb felületet kapnánk: egyetlen run() metódus mind a 40 macska számára.
Hozzászólások
  • Népszerű
  • Új
  • Régi
Hozzászólás írásához be kell jelentkeznie
Ennek az oldalnak még nincsenek megjegyzései