OOP #6 (VMT és DMT) v1.0 2003.03.07. 19:33:00 Eszterházy Károly Főiskola Információtechnológia tsz. Hernyák Zoltán adj. e-mail: aroan@ektf.hu web: http://aries.ektf.hu/~aroan OOP OOP_06-1 -
E jegyzet másolata nem használható fel szabadon, az előadás anyagának kivonata. Ezen teljes jegyzetről, vagy annak bármely részéről bármely másolat készítéséhez a szerző előzetes írásbeli hozzájárulására van szükség. A másolatnak tartalmaznia kell a sokszorosításra vonatkozó korlátozó kitételt is. A jegyzet kizárólag főiskolai oktatási vagy tanulmányi célra használható! A szerző hozzájárulását adja ahhoz, hogy az EKF számítástechnika tanári, és programozó matematikus szakján, a tárgyat az EKF TO által elfogadott módon felvett hallgatók bármelyike, kizárólag saját maga részére, tanulmányaihoz egyetlen egy példány másolatot készítsen a jegyzetből. A jegyzet e változata még tartalmazhat mind gépelési, mind helyességi hibákat. Az állítások nem mindegyike lett tesztelve teljes körűen. Minden észrevételt, amely valamilyen hibára vonatkozik, örömmel fogadok. Hernyák Zoltán aroan@ektf.hu OOP OOP_06-2 -
Virtuális Metódus Tábla A késői kötés egy keresés -t jelent, meg kell határozni a ténylegesen meghívandó metódust A cél az, hogy ez a keresés a lehető legegyszerűbb kóddal, a lehető leggyorsabban megvalósuljon Ehhez egy plusz táblázat felépítése és megtartása szükséges: a Virtuális Metódus Táblázat (VMT) Virtuális Metódus Tábla OOP_06-3 -
Ezen táblázat mindig egy osztályhoz tartozik A VMT tábla induláskor megegyezik az ősének a VMT-jével (ha nincs ős, akkor induláskor üres) Ha az osztályban bevezetünk egy új virtuális metódust a virtual kulcsszóval, akkor ezen metódus bekerül a táblázatba (a végére) Ha az osztályban felüldefiniáltunk egy már létező virtuális metódust az override kulcsszóval, akkor a táblázatba ezen bejegyzés kicserélődik az új metódusra A táblázatban a metódusok indításához szükséges információk vannak eltárolva (pl. a metódusok memóriacímei, amely alapján azokat el lehet indítani) Virtuális Metódus Tábla OOP_06-4 -
class elso { public virtual int metodus_a() { } // a : új sor public virtual int metodus_d() { } // d : új sor public void metodus_c() { metodus_a(); } // nem virtuális! } class masodik:elso { public override int metodus_a() { } // a : módosító sor public virtual int metodus_b() { } // b : új sor } class elso VMT Int metodus_a() Int metodus_d() class masodik VMT Int metodus_a() Int metodus_d() Int metodus_b() elso.metodus_a elso.metodus_d masodik.metodus_a elso.metodus_d masodik.metodus_b Virtuális Metódus Tábla OOP_06-5 -
A késői kötés fordítása során olyan programkód kerül fordításra, amely a VMT táblázat alapján hozza meg a döntést, hogy melyik konkrét metódust kell meghívni. Az e.metodus_c() esetén az e példányhoz az class elso VMT tábla tartozik, hiszen az e példány az elso osztály egy példánya! Ezért a késői kötés a class elso VMT tábla szerint a metodus_a() hívás esetén az elso.metodus_a() metódust kell meghívni. A m.metodus_c() esetén az m példányhoz az class masodik VMT tábla tartozik, hiszen az m példány az masodik osztály egy példánya! Ezért a késői kötés a class masodik VMT tábla szerint a metodus_a() hívás esetén az masodik.metodus_a() metódust kell meghívni. Virtuális Metódus Tábla OOP_06-6 -
Előnyök: A késői kötést feloldó programkód rövid, egyszerű, gyors. Hátrányok: A VMT táblát el kell készíteni (fordítási idő) A példányokhoz a VMT táblát hozzá kell rendelni (futási idő) A VMT tábla túl sok memóriát köt le o Mindig legalább annyi sora van, mint az ős VMT táblának o Újabb sorokkal bővül, ha új virtuális metódust vezetünk be o Akkor is őriz egy bejegyzést, ha annak átdefiniálása nem történt meg (pl. class masodik VMT metodus_d() sor!) A VMT táblát a fordító program el tudja készíteni, és a VMT tábla eltárolásra kerül a futtatandó állományban. A példányhoz rendelést a konstruktor teszi meg, automatikusan (generált programkód) Virtuális Metódus Tábla OOP_06-7 -
Dinamikus Metódus Tábla A szerepe megfelel a VMT-nek (késői kötés feloldását támogatni) Kevesebb memóriaigénye van, mint a VMT-nek Lassúbb a kezelése Felépítése: Hasonló, mint a VMT Osztályhoz van hozzárendelve A DMT induláskor üres Ha az osztályban bevezetünk egy új virtuális metódust a virtual kulcsszóval, akkor ezen metódus bekerül a táblázatba (a végére) Ha az osztályban felüldefiniáltunk egy már létező virtuális metódust az override kulcsszóval, akkor ez is bekerül a táblázatba Dinamikus Metódus Tábla OOP_06-8 -
A DMT mindig tartalmaz egy bejegyzést, hogy hol van az ős osztály DMT-je. Ha ilyen nincs, akkor azt a NIL jelzi. A táblázatban a metódusok indításához szükséges információk vannak eltárolva (pl. a metódusok memóriacímei, amely alapján azokat el lehet indítani) Lényeges különbség: a DMT induláskor nem tartalmazza az ős osztály DMT táblájának sorait. class elso DMT int metodus_a() int metodus_d() class masodik DMT int metodus_a() int metodus_b() ŐS DMT = NIL elso.metodus_a elso.metodus_d ŐS DMT = elso DMT masodik.metodus_a masodik.metodus_b Nem szerepel a class masodik DMT -ben a int metodus_d() sora, mert azt nem definiáltuk felül a masodik osztályban. Dinamikus Metódus Tábla OOP_06-9 -
A DMT alapján a késői kötés feloldás kódvázlata: P := példány.dmt kezdőcíme Ciklus amíg P<>NIL IF P-ben szerepel a keresett metódus Metódus meghívása Kilépés a ciklusból ENDIF P := P.ŐS_DMT tábla kezdőcíme CVÉGE Vagyis a DMT táblákban keresés során ha a jelenlegi DMT táblában nincs benne a keresett metódusról az információ, akkor visszalépünk az ős metódus DMT-jébe (masodik -> elso), és ott folytatjuk a keresést. Dinamikus Metódus Tábla OOP_06-10 -
Előnyök: A DMT táblák kevesebb memóriát kötnek le o Csak azon bejegyzések szerepelnek benne, amelyek ténylegesen változást szenvedtek el az ős DMT-hez képest Hátrányok: A késői kötést feloldó generált programkód bonyolultabb és lassúb A DMT táblát el kell készíteni (fordítási idő) A példányokhoz a DMT táblát hozzá kell rendelni (futási idő) Dinamikus Metódus Tábla OOP_06-11 -
Amely nyelvekben mindkettőt lehet használni, ott az a javaslat, hogy azon metódusokat kezeljük VMT technikával, amelyek hívása gyors kell legyen (sokszor hívjuk meg, pl. egy ciklus belsejében). Azokat tegyük DMT táblába, amelyeket az öröklés-továbbfejlesztés során felüldefiniálhatnak mások (bár erre előre láthatólag ritkán kerül majd sor), vagy a metódust ritkán hívják meg ezért nem számottevő a lassúbb kezelésből adódó lassúbb programfutás. Amely metódusokat nem szükséges, ne tegyük egyik táblába sem, mert feleslegesen kötünk le memóriát, és feleslegesen lassítjuk a program futását. Dinamikus Metódus Tábla OOP_06-12 -