Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.

Hasonló előadás


Az előadások a következő témára: "1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz."— Előadás másolata:

1 1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz

2 2 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.

3 3 class TElso { public int szamol() { return 10; } public int akarmi() { return szamol()+1; } 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; } } class TMasik:TElso { public new int szamol() { return 20; } } TElso E = new TElso(); int ne = E.akarmi();

4 4 class TElso { public virtual int szamol() { return 10; } public int akarmi() { return szamol()+1; } class TElso { public virtual int szamol() { return 10; } public int akarmi() { return szamol()+1; } class TOtodik:TElso { public override int szamol() { return 20; } } class TOtodik:TElso { public override int szamol() { return 20; } } TOtodik O = new TOtodik(); int no = O.akarmi(); Késői kötés : hogy ez konkrétan melyik fv legyen, az majd futás közben fog eldőlni. TElso E = new TElso(); int ne = E.akarmi(); Nem lehet tovább halogatni a döntést. TElso.szamol lesz a választás! Itt TOtodik.szamol lesz a választás! Miért? Mi dönti el?

5 5 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.

6 6 class TElso { public virtual int A() {} public virtual int B() {} public virtual void D() () public void E() {} } class TElso { public virtual int A() {} public virtual int B() {} public virtual void D() () public void E() {} } class TMasodik:TElso { public override int B() {} public virtual void C() {} } class TMasodik:TElso { public override int B() {} public virtual void C() {} } TElso VMT A | TElso.A B | TElso.B D | TElso.D A | TElso.A B | TElso.B D | TElso.D TMasodik VMT A | TElso.A B | TMasodik.B D | TElso.D C | TMasodik.C A | TElso.A B | TMasodik.B D | TElso.D C | TMasodik.C

7 7 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

8 8 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!

9 9 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.

10 10 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

11 11 class TElso { public virtual int A() {} public virtual int B() {} public virtual void D() () public void E() {} } class TElso { public virtual int A() {} public virtual int B() {} public virtual void D() () public void E() {} } class TMasodik:TElso { public override int B() {} public virtual void C() {} } class TMasodik:TElso { public override int B() {} public virtual void C() {} } TElso DMT A | TElso.A B | TElso.B D | TElso.D A | TElso.A B | TElso.B D | TElso.D TMasodik DMT B | TMasodik.B C | TMasodik.C B | TMasodik.B C | TMasodik.C ŐS = null ŐS = TElso.DMT

12 12 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

13 13 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ó.

14 14 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

15 15 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.

16 16 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.

17 17 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

18 18 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.


Letölteni ppt "1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz."

Hasonló előadás


Google Hirdetések