A polimorfizmusról általában
  A statikus polimorfizmus

Statikus explicit polimorfizmus:
A függvénytúlterhelés



A függvénytúlterhelés azt jelenti, hogy több
  • egyforma nevű, de
  • különböző paraméterlistájú
függvény létezik, melyek közül a fordítóprogram a hívás helyén átadott aktuális paraméterek típusából dönti el, hogy melyiket alkalmazza.

Tehát ez statikus polimorfizmus, mivel fordítási időben eldől, hogy melyik függvény hívódik meg, továbbá explicitnek is nevezhető, mert a paraméterek típusára kikötés van megadva.

Mintapélda

Az explicit polimorfizmust bemutató Java nyelvű
mintapéldát most át fogjuk alakítani úgy, hogy nem harcost, hanem egy általános szereplőt fog működtetni a függvény.

Van a játékban egy Szamuráj és egy PincsiKutya osztály, melyek egymástól teljesen függetlenek, semmi közük nincs egymáshoz, viszont mindkettőnek van Védekezik() metódusa:

class Szamuráj{
  public void Védekezik(){
    System.out.println("Elszántan kaszabolok!");
  }
}

class PincsiKutya{
  public void Védekezik(){
    System.out.println("Gazdámhoz szaladok!");
  }
}

Ha egy SzereplőtMűködtet() függvénynek mindkét fajta objektumot át akarjuk adni paraméterként, ennek legprimitívebb megoldása az, hogy két változatot készítünk a függvényből, azaz túlterheljük a függvénynevet:

  static void SzereplőtMűködtet(Szamuráj Szereplő){
    Szereplő.Védekezik();
  }

  static void SzereplőtMűködtet(PincsiKutya Szereplő){
    Szereplő.Védekezik();
  }

A függvények hívása így történhet:

  Szamuráj    sz = new Szamuráj(); 
  PincsiKutya p  = new PincsiKutya();

  SzereplőtMűködtet(sz);
  SzereplőtMűködtet(p);

és a kimenet természetesen ez lesz:

  Elszántan kaszabolok!
  Gazdámhoz szaladok!

Azonnal látszik ennek a megoldásnak a hátránya: többször meg kell írnunk ugyanazon SzereplőtMűködtet() függvényt úgy, hogy csak a paraméter típusa különbözik, a függvény belseje egy az egyben változatlan. Elegánsabb módszert kínál itt egy sablon alkalmazása – vagy lehetőség esetén dinamikus polimorfizmus használata – hiszen ebben az esetben éppen az a jellemző, hogy mindig ugyanazt a metódusát (Védekezik) használjuk a paraméter-objektumnak:


A különbség csak abban jelentkezik, hogy végül ténylegesen melyik konkrét Védekezik metódus hívódik fel.

Egy meggyőzőbb mintapélda:
Különböző metódusok felhívása

A
fentinél helyénvalóbb, ügyesebb alkalmazása a függvénytúlterhelésnek az, amikor egy paraméter típusától függően mást és mást kell csinálni egy függvényben. Pontosabban: nem ugyanolyan nevű, különböző tartalmú metódusokat kell felhívni, hanem más metódusokat.

A függvénytúlterhelést akkor célszerű használni a sablonok helyett, ha mindegyik függvény belsejében más történik. Azaz: amikor a paraméter (kiszolgáló) típusa szerint elágazik a program.

Tegyük fel, hogy egy számítógépes játékban van egy Harcos szereplő, mely tud védekezni támadás ellen, de ezt különféleképpen teszi aszerint, hogy milyen típusú a támadó. Mást csinál, amikor egy Szamuráj az ellenfél és megint mást, amikor egy PincsiKutya a támadó. Ezt például úgy tudjuk elérni, hogy két Védekezik nevű metódust is készítünk Harcosnak; a metódus paramétere pedig maga a támadó:

  class Szamuráj    { /*...*/ }
  class PincsiKutya { /*...*/ }

  class Harcos{
    public void Védekezik(Szamuráj Támadó){
      System.out.println("Szamuráj támad, ágyúval védekezem!");
    }

    public void Védekezik(PincsiKutya Támadó){
      System.out.println("PincsiKutya támad, felrúgom szegényt kapásból!");
    }
  }

Most tehát a támadó típusától függ, hogy mi fog történni:


A fordítóprogram persze mindig helyesen ki fogja választani a paraméter típusa alapján, hogy adott ponton melyik metódus hívandó fel:

  Szamuráj    sz = new Szamuráj(); 
  PincsiKutya p  = new PincsiKutya();
  Harcos      h  = new Harcos();

  h.Védekezik(sz);
  h.Védekezik(p);

Ennek programrészletnek a kimenete nyilván a következő lesz:

  Szamuráj támad, ágyúval védekezem!
  PincsiKutya támad, felrúgom szegényt kapásból!

Természetesen itt is igaz, hogy a két objektumnak, melyek típusa alapján a ténylegesen végrehajtandó függvény kiválasztódott (Szamuráj és PincsiKutya), semmilyen rokonsági kapcsolatban nem kell állniuk egymással. Azaz: valóban implicit polimorfizmussal állunk szemben.


A statikus polimorfizmus
  A polimorfizmusról általában