A VIRT programozási nyelv

Objektum-orientált programozás

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.