An object-oriented programming example
The following is an example of object-oriented programming with the use
of virtual methods.
let type Point := real # real;
let type Tile := Point # Point;
let PrintPoint :=
fun(p :Point) :null is
(printstring("(");
printreal(fst(p));
printstring(",");
printreal(snd(p));
printstring(")") );
let PrintTile :=
fun(t :Tile) :null is
(printstring("(");
PrintPoint(fst(t));
printstring(",");
PrintPoint(snd(t));
printstring(")"));
let rec Pictures class
Picture <->
[ Class:string;
Area:= meth() :real is virtual;
Tile:= meth() :Tile is virtual;
Print := meth() :null is
( newlines(1);
printstring(" Class: ");
printstring(self.Class);
newlines(1);
printstring(" Area: ");
printreal(self.Area);
newlines(1);
printstring(" Tile: ");
PrintTile(self.Tile);
newlines(2))
];
let rec
Rectangles subset of Pictures class
Rectangle <-> is Picture and
[ Class := "RECTANGLE";
Vertixes :Tile;
Area := meth() :real is
use t := self.Vertixes
in (fst(snd(t))-fst(fst(t))) *
(snd(snd(t))-snd(fst(t)));
Tile := meth() :Tile is
self.Vertixes
];
let rec
Circles subset of Pictures class
Circle <-> is Picture and
[ Class := "CIRCLE";
Center :Point;
Radius :real;
Area := meth() :real is
use r := self.Radius
in r * r * 3.14;
Tile := meth() :Tile is
use cx:= fst(self.Center)
and cy := snd(self.Center)
and r := self.Radius
in ((cx - r, cy - r),(cx + r, cy + r));
Print := meth() :null is
(newlines(1);
(super.Print);
printstring(" Center: ");
PrintPoint(self.Center);
newlines(1);
printstring(" Radius: ");
printreal(self.Radius);
newlines(2))
];
let c := mkCircle([Center := (1.5, 2.5); Radius := 12.]);
let r := mkRectangle([Vertixes:=((2.,3.5),(11.2,17.1)) ]);
select Print
from Pictures ;
Class:RECTANGLE
Area: 125.12000
Tile:((2,3.50000),(11.20000,17.10000))
Class:CIRCLE
Area: 452.16000
Tile: ((-10.50000,-9.50000),(13.50000, 14.50000))
Center:(1.50000,2.50000)
Radius:12