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