A polimorfizmusról általában
  A dinamikus polimorfizmus

Az implicit dinamikus polimorfizmus



Az implicit polimorfizmusnál a kiszolgáló objektum típusára nincs explicit megkötés, csak a tulajdonságaira, azaz arra, hogy az illető objektum rendelkezzen az adott helyen ténylegesen meghívott metódusokkal.

Az explicit polimorfizmust bemutató Java nyelvű mintapéldában ez azt jelentené, hogy átadhatunk a HarcostMűködtet függvénynek bármely tetszőleges objektumot, melynek van nyilvános Védekezik() metódusa. Az, hogy milyen egyéb (itt nem használt) metódusai vannak, az teljesen mindegy.

Ám a Java nyelvben nem létezik dinamikus és egyben implicit polimorfizmus, továbbá a C++-ban sem létezik ilyen. Ha erre a fajtára vagyunk kíváncsiak, akkor más nyelvhez kell fordulnunk.

Ellenőrizetlen implicit polimorfizmus

Ha a ténylegesen felhasznált kiszolgáló nem rendelkezik valamelyik felhívni kívánt metódussal, akkor erre a fordítóprogram nem figyelmeztet minket. Csak a tényleges metódushívás helyén derül ki a hiba, ekkor persze a program futása hibajelzéssel leáll.

Egy VB6 mintapélda

Elkészítjük a
mintapélda ellenőrizetlen implicit megfelelőjét Visual Basicben. Létrehozunk a projektünkben egy Class modult Harcos névvel és definiálunk neki egy nyilvános szubrutint:

  Public Sub Védekezik()

  MsgBox "Lövöldözöm midhalálig!"

  End Sub

Létrehozunk egy GyávaHarcos nevű osztályt is és neki is definiálunk egy ugyanilyen nevű szubrutint:

  Public Sub Védekezik()

  MsgBox "Fejvesztve menekülök!"

  End Sub

Ezután megírjuk a HarcostMűködtet szubrutint:

  Public Sub HarcostMűködtet(ByVal H As Object)

  H.Védekezik

  End Sub

Figyeljük meg, hogy a paraméter típusa Object, tehát nincs megkötés a típusra azon kívül, hogy 'tetszőleges objektum'. A függvény hívása így néz ki:

  Dim h1 As Harcos
  Dim h2 As GyávaHarcos

  Set h1 = New Harcos
  Set h2 = New GyávaHarcos

  HarcostMűködtet h1
  HarcostMűködtet h2

A HarcostMűködtet szubrutinnak tehát átadhatunk paraméterként bármilyen objektumot, melynek van nyilvános Védekezik szubrutinja, azaz valóban implicit polimorfizmussal állunk szemben.

Ahogy már említettük, a VB-ben az implicit polimorfizmus ellenőrizetlen, tehát hogyha HarcostMűködtet szubrutinnak paraméterként egy olyan objektumot adunk át, mely nem rendelkezik a szükséges Védekezik metódussal, erre a fordító nem figyelmeztet bennünket, a hiba csak futás közben, mégpedig a metódushívás helyén derül ki (és természetesen programleállást okoz).

Egy JavaScript mintapélda

Elkészítjük a
mintapélda ellenőrizetlen implicit megfelelőjét JavaScriptben. Először is definiáljuk a kétféle Védekezik függvényt:

  function Védekezik1(){
    alert("Lövöldözöm midhalálig!");
  }

  function Védekezik2(){
    alert("Fejvesztve menekülök!");
  }

Ezután elkészítjük a kétféle objektum konstruktorát:

  function Harcos(){             // Harcos konstruktora
    this.Védekezik = Védekezik1; // Harcos metódusa Védekezik1 lesz
  }

  function GyávaHarcos(){        // GyávaHarcos konstruktora
    this.Védekezik = Védekezik2; // GyávaHarcos metódusa Védekezik2 lesz
  }

Majd megírjuk a HarcostMűködtet függvényt:

  function HarcostMűködtet(H){
    H.Védekezik();
  }

A függvény hívása így néz ki:

  var h1,h2;

  h1 = new Harcos();
  h2 = new GyávaHarcos();

  HarcostMűködtet(h1);
  HarcostMűködtet(h2);

Természetesen a JavaScriptben az implicit polimorfizmus ellenőrizetlen, hiszen ez egy interpretált nyelv, nincs fordítási fázis, amikor kiderülhetnének a hibák.

Egy Python mintapélda

Elkészítjük a
mintapélda ellenőrizetlen implicit megfelelőjét Pythonban. Először is létrehozunk egy Harcos és egy GyavaHarcos osztályt:

  class Harcos:
    def Vedekezik(self):
      print "Lövöldözöm midhalálig!"

  class GyavaHarcos:
    def Vedekezik(self):
      print "Fejvesztve menekülök!"

Ezután megírjuk a HarcostMukodtet függvényt:

  def HarcostMukodtet(H):
    H.Vedekezik()

A függvény hívása így néz ki:

  h1 = Harcos()
  h2 = GyavaHarcos()

  HarcostMukodtet(h1)
  HarcostMukodtet(h2)

Természetesen a Pythonban az implicit polimorfizmus ellenőrizetlen, hiszen ez egy interpretált nyelv, nincs fordítási fázis, amikor kiderülhetnének a hibák.


A dinamikus polimorfizmus
  A polimorfizmusról általában