Virtuális Metódus Tábla

Download Report

Transcript Virtuális Metódus Tábla

Hernyák Zoltán
Programozási Nyelvek II.
Eszterházy Károly Főiskola
Számítástudományi tsz
1
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
class TElso
{
public int szamol() { return 10; }
public int akarmi()
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
return szamol()+1;
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
class TElso
{
public virtual int szamol() { return 10; }
public int akarmi()
Késői kötés: hogy ez
{
konkrétan melyik fv legyen, az
majd futás közben fog eldőlni.
return szamol()+1;
}
}
class TOtodik:TElso
{
public override int szamol() { return 20; }
}
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?
Nem lehet tovább
halogatni a
döntést.
TElso.szamol
lesz a választás!
4
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
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() {}
}
TElso VMT
A | TElso.A
B | TElso.B
D | TElso.D
TMasodik VMT
A
B
D
C
|
|
|
|
TElso.A
TMasodik.B
TElso.D
TMasodik.C
6
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 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 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 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
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() {}
}
TElso DMT
ŐS = null
A | TElso.A
B | TElso.B
D | TElso.D
TMasodik DMT
ŐS = TElso.DMT
B | TMasodik.B
C | TMasodik.C
11
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 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 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 tábla memóriaigény
A VMT táblában egy tétel csak 1 db memóriacímet tartalmaz ( 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 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
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
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