Contributed by Chris Rathman
Reworked by Pixel <pixel@mandrakesoft.com>
class virtual shape initx inity =
object (self)
val mutable x = initx
val mutable y = inity
(* accessors for x & y coordinates *)
method getX = x
method getY = y
method setX newx = x <- newx
method setY newy = y <- newy
(* move the x & y position of the object *)
method moveTo newx newy =
self#setX newx;
self#setY newy
method rMoveTo deltax deltay =
self#setX (self#getX + deltax);
self#setY (self#getY + deltay)
(* abstract draw method *)
method virtual draw : unit
end
class rectangle initx inity initwidth initheight =
object (self)
inherit shape initx inity
val mutable width = initwidth
val mutable height = initheight
(* accessors for width & height *)
method getWidth = width
method getHeight = height
method setWidth newwidth = width <- newwidth
method setHeight newheight = height <- newheight
(* draw the rectangle *)
method draw =
Printf.printf "Drawing a Rectangle at:(%d,%d), width %d, height %d\n"
self#getX self#getY self#getWidth self#getHeight
end
class circle initx inity initradius =
object (self)
inherit shape initx inity
val mutable radius = initradius
(* accessors for the radius *)
method getRadius = radius
method setRadius newradius = radius <- newradius
(* draw the circle *)
method draw =
Printf.printf "Drawing a Circle at:(%d,%d), radius %d\n"
self#getX self#getY self#getRadius
end
let main () =
(* set up lists to hold the shapes *)
let (scribble: shape list) = [
(new rectangle 10 20 5 6 :> shape);
(new circle 15 25 8 :> shape)] in
(* iterate through the lists and handle shapes polymorphically *)
List.iter (fun each ->
each#draw;
each#rMoveTo 100 100;
each#draw
) scribble;
(* call a rectangle specific instance *)
let arectangle = new rectangle 0 0 15 15 in
arectangle#draw;
arectangle#setWidth 30;
arectangle#draw;;
main ();;
|
ocamlc -c polymorph.ml ocamlc -o polymorph.exe polymorph.cmo |
Drawing a Rectangle at:(10,20), width 5, height 6 Drawing a Rectangle at:(110,120), width 5, height 6 Drawing a Circle at:(15,25), radius 8 Drawing a Circle at:(115,125), radius 8 Drawing a Rectangle at:(0,0), width 15, height 15 Drawing a Rectangle at:(0,0), width 30, height 15 |