2.7. Többalakúság

iDevice ikon

Az objektumok közötti információ közvetítés adatok átadásán keresztül történik, az osztály egy metódusának meghívásával. Az adatok a metódus paraméter listájában (lehet 1 paraméter is) kerülnek felsorolásra. A metódus a megkapott adatot feldolgozza az objektumban tárolt adatokkal összefüggésben. A metódus neve ilyenkor utal az elvégzendő feladatra, pl.: „addHozzá", „vondKi". Természetesen a művelet más és más attól függően, hogy az osztály milyen jellemzőkkel bír. Egy számokkal foglalkozó osztálynál egy számtani műveletet, szöveges adatokat kezelő osztálynál ez szöveg összefűzést és szétbontást jelenthet. Megadható egy ősosztályban ez a két művelet valamilyen közös ősosztályt definiálva, amit majd a leszármazott osztályok a magukra jellemző módon megvalósítanak.

Tételezzük fel, hogy egy szöveges adatokkal foglalkozó osztályunk van. Az addHozzá metódus, akkor szöveges összefűzést takar. Az addHozzá metódus szignatúrája így nézhet ki:

public AddHozzá(Szöveg hozzáadandó ) {}

A fenti definícióban az osztály AddHozzá metódusa paraméterként vár egy darab „Szöveg" típusú paramétert, amit itt most „hozzáadandó"-nak neveztünk el. A metódus eljárása pedig az objektumban tárolt szöveghez hozzáfűzi a ' hozzáadandó'-t. De mi van akkor, ha nem egy, hanem kettő vagy három szövegrészt is egy műveletben szeretnénk összefűzetni?

Ezek szignatúrája:

public AddHozzá(Szöveg hozzáadandó1, Szöveg hozzáadandó2 {}

public AddHozzá(Szöveg hozzáadandó1, Szöveg hozzáadandó2, Szöveg hozzáadandó3  ) {}

Sőt lehetséges az osztály képességeit úgy is bővíteni, hogy számot is tudjon a szöveghez hozzáfűzni. (Ilyenkor a számot szöveges formába kell alakítani a metóduson belül.)

public AddHozzá(Szám hozzáadandó) {}

A metódus neve minden esetben lefedi a feladatot, viszont különböző helyzetek szerint más és más eljárás kerül végrehajtásra, attól függően, hogy milyen a metódus paraméter listája, a paraméterek mennyisége és paraméterek típusa. A folyamatot, ahogy a végrehajtandó metódusokhoz kapcsolják a paraméterektől függő metódushívást binding-nek nevezik.

A többalakúság értelmezhető az osztályok hierarchiájában is. Ha egy ősosztályban definiált metódust magasabb absztrakciójú paraméteretekkel definiálunk, majd a leszármazottban egy konkrétabb típussal, akkor az a metódus fog meghívódni, ami specializáltabb szignatúrát határoz meg. Példaként:

Ősosztály:
AddHozzá(Object paraméter){}

SzármazottOsztály:   (Származik az „Ősosztály"-ból)

AddHozzá(Szöveg paraméter){}

 

Most attól függ, hogy az ős vagy a leszármazott osztálybeli felülbírált AddHozzá metódus kerül végrehajtásra, hogy milyen osztályszintű paramétert adunk meg.

Ha Szöveg típusút, akkor a SzármazottOsztály AddHozzá metódusa hívódik, függetlenül attól, hogy mint említettük a Szöveg osztály is az Object osztályból származik.

Ha bármilyen más típussal hívjuk meg, akkor az Ősosztály AddHozzá metódusa hívódik, mivel minden más típus (pl. egy szám is) az Object-ből, mint legfelső ősosztályból származik.

A strukturált programnyelvekben ezzel szemben az eljárások egy programon vagy egy blokkon belül csak egyedi névvel rendelkezhetnek.