A Fables programozási nyelv

Objektum-orientált programozás

Osztályok

Az osztályok Fables-ben azonos típusú ágensek (objektumok) halmaza. Fables-ben ez egyben egy séma az egyes példányokra.

Az osztályok szintaxisa hasonló a modellek szintaxisához. Az osztályok definícióját a class <ClassName> begin és a szokásos end kulcsszó között fejthetjük ki. Ezen a blokkon belül definiálhatjuk az osztályhoz tartozó függvényeket. A Demó verzióban az osztályok nem ágyazhatók egymásba.

Példa:

class Agent begin color = 1; var id; var pos; move(x) = pos := pos+x; end

Az osztályok egy új névteret vezetnek be: egy változó az osztályban elfedi a modellben definiált ugyanolyan nevű változót.

Példa:

X = 1; writeOuterX = printLn(X); class A begin X = 2; writeInnerX = printLn(X); end
Az eredmény pedig a következő lesz:
1 2

Az osztályban definiált függvények minden egyes ágensben elérhetők, azonban minden ágens külön-külön rendelkezik a változóival. Az ágensek hivatkozhatnak a modell tagjaira.

Példa:

isGreatEnough(x) = x >= 5; class Agent begin var size; grow = isGreatEnough(size) => size := size+1; end

Az ágensek osztályának neve egyben egy halmazt is jelöl, amely az összes ágens példányát tartalmazza. Ezáltal hivatkozhatunk az összes ágensre.

Példa:

class SetAgent begin var id; ... end ids = { a.id : a is SetAgent };
A fent definiált ids konstans az összes SetAgent egyed id mezőjét tartalmazza.

Az osztályokon belül lehetséges a self kulcsszó használata, ami az aktuális példányra hivatkozik. Láthatósági szempontokból lehet leggyakrabban rá szükség.

Példa:

class Agent begin var id; var name; less ( id ) = self.id < id; end
A fenti példában a less függvény igazat ad vissza, ha az aktuális objektum id értéke kevesebb, mint a paraméterként kapott id.

Objektumok

Új példányokat a new operátorral hozhatunk létra, amelynek általános formája a következő:

new <ClassName> [ <initial-assignments> ]

Példa:

class Agent begin var id; var name; end ... new Agent [ id:=1, name:="Agent Smith" ]

A kezdeti értékadásoknál nem kell az osztály minden egyes adattagját beállítani, mert minden adattag kap egy alapértelmezett értéket a típusa alapján.

Objektumok tagjaira a pont operátorral hivatkozhatunk:

<object>.<member>

Objektumokat változókban tárolhatunk, ill. az ágensek halmazából kérdezhetjük le.

Például:

obj := new Agent[id:=1; name:="Agent Smith"]
A fenti értékadás létrehoz egy ágenst, beállítja az értékeit, és eltárolja egy obj változóban.

printLn Agent(0).name
A fenti példa kiírja az első ágens nevét a képernyőre.

Mind az osztályok, mind a modellek rendelkezhetnek startUp blokkokkal. Amikor egy objektum létrejön, akkor kerül végrehajtásra annak startUp része, és minden egyes schedule-ja elindul. Modell esetén a paraméterektől függő értékek beállítása is itt történik.

A szintaxisa a következő:

startUp (<parameter>,<parameter>,..) {      <expression>;      <expression>; ... }
Ha nincsenek paraméterek, a zárójelek elhagyható.

Az osztályok startUp blokkjai egyelőre nem támogatnak paramétereket.

Példa:

startUp { printLn "Initialization..."; }

A paraméterek a modellben szereplő definiált konstansok lehetnek. Ezek az értékek a konkrét futtatások előtt beállíthatók.

A modell osztályok startUp blokkjának első eleme ajánlatos, ha a seed() beállítása, amely gondoskodik a modell egészét felügyelő véletlenszám-generátor működését (erről még késöbb a Véletlenek fejezetben).

Példa:

startUp (agents) { seed(0); printLn( "Initialization..." ); [ new Agent[ money := 0 ] : _ is [1..agents] ]; }

Öröklődés

Kidolgozásra vár.

Polimorfizmus, dinamikus kötés

Kidolgozásra vár.

Interfészek

Kidolgozásra vár.