190 likes | 290 Views
Microsoft.NET környezet. Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz. 1. VMT: Virtuális Metódus Tábla. Virtuális metódus : olyan metódus, amely az ős osztályban lett definiálva, de a gyermekosztályban
E N D
Microsoft.NET környezet Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz 1
VMT: Virtuális Metódus Tábla Virtuális metódus: olyan metódus, amely az ős osztályban lett definiálva, de a gyermekosztályban ugyanolyan névvel és paraméterezéssel felül lehet definiálni, és ezt a metódus-változatot az ős osztály metódusai is meg tudják hívni. Az ilyen metódusokra a fordító progam a késői kötést alkalmazza. Virtuális metódusok használatánál tilos: - megváltoztatni a paraméterezést! - a fv visszatérési típusát! Az ős osztályban a ‘virtual’ kulcsszóval kell jelölni, hogy a metódusok virtuális lesz. A gyermekosztályban pedig az ‘override’ kulcsszót kell használni. 2
Korai kötés működése class TElso { public int szamol() { return 10; } public int akarmi() { return szamol()+1; } } Korai kötés: ezen fv hívás mindig ezt a fv-t hívását jelenti. Ez rögzített, és nem változik meg sosem, semmilyen körülmények között (”beégetődik a kódba”). class TMasik:TElso { public new int szamol() { return 20; } } TElso E = new TElso(); int ne = E.akarmi(); 3
VMT: Virtuális Metódus Tábla class TElso { public virtual int szamol() { return 10; } public int akarmi() { return szamol()+1; } } Késői kötés: hogy ez konkrétan melyik fv legyen, az majd futás közben fog eldőlni. ? class TOtodik:TElso { public override int szamol() { return 20; } } Nem lehet tovább halogatni a döntést. TElso.szamol lesz a választás! TElso E = new TElso(); int ne = E.akarmi(); TOtodik O = new TOtodik(); int no = O.akarmi(); Itt TOtodik.szamol lesz a választás! Miért? Mi dönti el? 4
VMT: Virtuális Metódus Tábla Késői kötés: a kötés feloldását a rendszer elodázza a lehető legkésőbbi pillanatig. Ez konkrétan a hívás pillanatába dől el. Ekkor a rendszer megkeresi az adott példánytól függően a legfrisseb verziót az adott metódusból, és azt fogja meghívni! A ‘virtual’ kulcsszót akkor kell használni, amikor ‘bevezetjük’ a metódust (első eset). Minden további esetben az ‘override’-t kell használni. 5
VMT: Virtuális Metódus Tábla class TElso { public virtual int A() {} public virtual int B() {} public virtual void D() () public void E() {} } TElso VMT A | TElso.A B | TElso.B D | TElso.D class TMasodik:TElso { public override int B() {} public virtual void C() {} } TMasodik VMT A | TElso.A B | TMasodik.B D | TElso.D C | TMasodik.C 6
VMT: Virtuális Metódus Tábla VMT: Virtuális Metódus Tábla Készül: fordítási időben, a fordító prg által Minden osztályhoz 1 db készül Tartalmazza az adott osztály ÖSSZES virtuális metódusáról az információkat - beleértve az örökölt metódusokat is - és a frissen bevezett metódusokat is 7
VMT: Virtuális Metódus Tábla VMT készítés algoritmusa (1) másold le az ős osztályod VMT-jét ha nincs ősöd*, akkor üres a VMT (2) itt van override-os metódus? -> írd át a megfelelő sort (3) itt van virtual-os metódus? -> add hozzá új sorként a tábla végéhez *: olyan nincs, hogy nincs ősöd. Ha nem jelölöd, akkor az System.Object az ősöd (magyarázat később). Csak a System.Object-nek nincs őse! 8
VMT: Virtuális Metódus Tábla VMT tábla használata (1) az adott példány esetén elővesszük a hozzá tartozó VMT táblát! (2) a VMT tábla megfelelő sorából kiolvassuk, melyik a legfrissebb verzió az adott metódusból. (3) Meghívjuk a metódust Megj: nem kell keresni. A VMT táblában ha egy metó- dus egyszer a táblázat n. sorba került, akkor a gyerekosztályok VMT táblájában is az n. sorban lesz majd. 9
VMT: Virtuális Metódus Tábla VMT tábla előnyök / hátrányok Előnyök: - gyors a kezelése Hátrány: - nagy a memóriaigény - a gyerekosztály VMT-je legalább olyan hosszú, mint az ősé-é… - ha a gyerekosztályban nincs override-os felüldefiniálás, akkor is tartalmazza az adott metódus adatait 10
DMT: Dinamikus Metódus Tábla class TElso { public virtual int A() {} public virtual int B() {} public virtual void D() () public void E() {} } TElso DMT ŐS = null A | TElso.A B | TElso.B D | TElso.D class TMasodik:TElso { public override int B() {} public virtual void C() {} } TMasodik DMT ŐS = TElso.DMT B | TMasodik.B C | TMasodik.C 11
DMT: Dinamikus Metódus Tábla DMT készítés algoritmusa (1) induláskor a DMT tábla üres (2) vedd fel az ‘ŐS’-höz az ős DMT tábla címét (3) itt van override-os metódus? -> add hozzá új sorként a tábla végéhez (4) itt van virtual-os metódus? -> add hozzá új sorként a tábla végéhez 12
DMT: Dinamikus Metódus Tábla DMT tábla használata (1) az adott példány esetén elővesszük a hozzá tartozó DMT táblát! (2) a DMT táblában rákeresünk az adott metódusra Ha megtaláljuk, akkor meghívjuk a metódust. (3) Ha nem találjuk meg, akkor a keresést folytatjuk az ős DMT-ben. Megj: A keresés szükséges, mert nem biztos, hogy ebben a táblában van a keresett információ. 13
DMT: Dinamikus Metódus Tábla DMT tábla előnyök / hátrányok Előnyök: - ‘kevesebb’ memóriába kerül Hátrány: - lassúbb a kezelés a keresés miatt 14
DMT: Dinamikus Metódus Tábla DMT tábla memóriaigény A VMT táblában egy tétel csak 1 db memóriacímet tar- talmaz ( 4 byte ). A metódus ‘nevét’ nem , mert az n. sor mindig ugyanazon metódushoz tartozik. A DMT táblában azonban két oszlop van: 1. oszlopban a metódus azonosítója van* 2. oszlopban a metódus memóriacíme (4 byte) * az azonosító általában egy sorszám (2 byte-os). Minden metódus kap egy egyedi sorszámot. 15
DMT: Dinamikus Metódus Tábla DMT tábla memóriaigénye Ha a DMT táblát azonosító szerint sorba rendezzük, akkor lehet benne bináris kereséssel keresni benne. Ha a DMT metódusokat ‘sűrűn’ felüldefiniáljuk, akkor a DMT tábla memórigénye nagyobb, mintha VMT-t használnánk, mivel 1 bejegyzés a DMT-ben másfélszer annyi byte, mint a VMT-ben. 16
DMT versus VMT Néhány nyelv mindkét típusú táblát kezeli. A programozó határozza meg azt, hogy a metódus melyik tábla alapján legyen kezelve: - ha a metódust várhatóan sűrűn meghívjuk (ciklus belsejéből, rekurzívan, …) akkor VMT-be kezeljük - ha a metódust valószínűleg felül fogja definiálni a várható gyermekosztályokban, akkor VMT - egyéb esetekben DMT 17
DMT versus VMT Van olyan nyelv (pl. Java), ahol minden metódus mindig virtuális ( nem kell külön jelölni a virtual kulcsszóval, sem a gyerekosztályokban az override kulcsszóval ). Legtöbb nyelv azonban csak egyfajta táblát kezel (általában a VMT-t). Ezen nyelvekben a programozó nem választhat a DMT és VMT között. 18