Osztályok
Specifikáció és implementáció
Az adattípus és az osztály azonos fogalmak a VIRT-ben. Az osztálydefinícióban az osztály neve, az õsosztály neve(opcionális),
az adott osztály specifikációja és implementációja szerepel. Az osztály definíciója csak metódusokat foglal magába.
Szintaxis
Class_interface_section =
class Class_name [ ":" Class_ancestor_name ]
{ Method_header [ constructor ] }
end
Method_header = Function_header
Class_implementation_section =
implementation
[ local [ shared ] Field { "," [ shared ] Field } ]
{ Method_definition }
end
Method_definition = Function_definition
Példa
A Point az õsosztály, a SetCircle, ..Draw függvények a Circle publikus függvényei.
class Circle : Point
function SetCircle( iX, iY, iR ) constructor
function GetNum()
function "<"( Z )
function Draw()
end
implementation Circle
local R, shared Num
function SetCircle( iX, iY, iR )
SetPoint( iX, iY )
R := iR
if Null( Num ) then
Num := 0
end
Num := Num + 1
return 0
function Norm() inline
return R
function GetNum() inline
return Num
function "<"( Z )
return R < Z.Norm()
function Draw() external
end
Adattagok és függvények
A publikus metódusok teljes szerkezete a következõ rekurzív definícióval adható meg:
"Public methods of the given class" = "Methods in interface section of the given class" +
"Public methods of the ancestor-class"
A local kulcsszó a mezõk listáját vezeti be. A mezõ egy bizonyos definiálatlan változó,
egy objektum, ami relációban van az adott osztállyal.
Az implementációs részben határozzuk meg az objektumok szerkezetét. Egy objektum magába foglalja az összes mezõt,
amit a local paranccsal adunk meg. Az osztály megosztott metódusait a local shared
szóval vezetjük be. Az objektum mezõ inicializálása a konstruktorral történik. A konstruktort constructor
kulcsszóval jelöljük .
Az R mezõ az egyetlen, amit a Circle osztály minden objektuma használhat. A Num egy megosztott mezõ. Norm egy privát metódus.
Objektumok
class Point -- egy nagyon egyszerû pont osztály
function SetPoint( iX, iY ) constructor -- konstruktor mûvelet
function GetX()
function GetY()
end
implementation Point
local X, Y
function SetPoint( iX, iY )
X := iX
Y := iY
return NIL
function GetX() inline
return X
function GetY() inline
return Y
end
object P : Point -- P egy Point típusú objektum
P.SetPoint( 3, 5 ) -- nem szükséges konstruktor hívása az objektum létrehozásához
object Q( 2, 4 ), R( 1, 8 ) : Point -- Q és R objektum létrehozása konstroktorral
write( 'Q.x : ' )
writeln( Q.GetX() )
write( 'Q.y : ' )
writeln( Q.GetY() )
return
Q.x : 2
Q.y : 4
Objektum pédányokat konstruktor nélkül is létre lehet hozni. Nincs lehetõség több konstruktor megadására, mivel Virt-ben nem
támogatott a függvény túlterhelés.
Öröklõdés
Virtben nincs többszörös öröklõdés.
Ha az adott osztály specifikációjában szerepel ugyanaz a metódusnév, mint az õsosztály specifikációjában,
akkor azonos paraméterekkel kell redelkezniük, ezt hívjuk virtuális függvénynek.
class Ancestor
function GetAttr()
end
implementation Ancestor
function GetAttr() inline
return 1
end
class Given : Ancestor
function GetAttr()
end
implementation Given
function GetAttr() inline
return 2
end
object Q : Given
object R : Ancestor
write( 'Q attributuma : ' )
writeln( Q.GetAttr() )
write( 'R attributuma : ' )
writeln( R.GetAttr() )
return
Q attributuma : 2
R attributuma : 1
Polimorfizmus, dinamikus kötés
Típus kiértékelés
A virt nyelv dinamikus típus kiértékelésû. A fordítás után a változók típusa undefined, és nicns hozzá memória lefoglalva. A típus meghatározása és a memória helyek lefoglalása futási idõben történik.
A ClassOf függvény visszaadja egy változó típusának egy numerikus ábrázolását. Null függvény 1-et ad vissza ha a váltzó még nem konkretizált.
A változók konkretizálása akkor történik ha:
- Értékadás történik. A:="alma"
- Egy változó álneve lesz. A = = B
- Helyettesítés történik. A > > B
- Függvény hívásnál.
- Tömb létrehozásánál, az elemek típusa a használatkor derül ki.
class Ancestor
function GetAttr()
end
implementation Ancestor
function GetAttr() inline
return 'Ancestor func used'
end
class Given : Ancestor
function GetAttr()
end
implementation Given
function GetAttr() inline
return 'Given func used'
end
object Q : Given -- Given típusú objektum
object R : Ancestor -- Ancestor típusú objektum
A := array( 2 ) -- két objektumot tömbbe tesszük
A[1] := Q
A[2] := R
object &P : Ancestor -- pszeudonim deklaráció
for I := 1 to 2 do
P == A[ I ] -- virtuális identifikáció
writeln( ClassOf(P)) -- kiíratjuk a P típusát
writeln( P.GetAttr()) -- kiíratjuk, hogy az õs, vagy a felüldefiniált metódust használja-e
end
return
1126
Ancestor func used
1017
Ancestor func used
Az eredmény alapján kijelenthetjük, hogy van polimorfizmus a VIRT - ben. A P változó típusa az elsõ és második esetben
különbözött. Dinamikus kötésrõl viszont nem valósult meg. Annak ellenére, hogy A[1] Given típusú volt, így a P is az lett,
mégis az Ancestor õsosztály függyvénye hívódott meg.