Contributed by Chris Rathman
declare class Shape attr x y %% constructor meth init(Newx Newy) {self moveTo(Newx Newy)} end %% accessors for x & y meth setX(Newx) x <- Newx end meth setY(Newy) y <- Newy end meth getX(?$) @x end meth getY(?$) @y end %% move the x & y coordinates meth moveTo(Newx Newy) {self setX(Newx)} {self setY(Newy)} end meth rMoveTo(Deltax Deltay) {self moveTo({self getX($)} + Deltax {self getY($)} + Deltay)} end end declare class Rectangle from Shape attr width height %% constructor meth init(Newx Newy Newwidth Newheight) Shape, init(Newx Newy) {self setWidth(Newwidth)} {self setHeight(Newheight)} end %% accessors for the width & height meth setWidth(Newwidth) width <- Newwidth end meth setHeight(Newheight) height <- Newheight end meth getWidth(?$) @width end meth getHeight(?$) @height end %% draw the rectangle meth draw() {System.print 'Drawing a Rectangle at:('} {System.print {self getX($)}} {System.print ','} {System.print {self getY($)}} {System.print '), width '} {System.print {self getWidth($)}} {System.print ', height '} {Show {self getHeight($)}} end end declare class Circle from Shape attr radius %% constructor meth init(Newx Newy Newradius) Shape, init(Newx Newy) {self setRadius(Newradius)} end %% accessors for the radius meth setRadius(Newradius) radius <- Newradius end meth getRadius(?$) @radius end %% draw the circle meth draw() {System.print 'Drawing a Circle at:('} {System.print {self getX($)}} {System.print ','} {System.print {self getY($)}} {System.print '), radius '} {Show {self getRadius($)}} end end declare proc {TryMe} local Scribble Arect in %% create a list containing various shape instances Scribble = {New Rectangle init(10 20 5 6)} | {New Circle init(15 25 8)} | nil %% iterate through the list and handle shapes polymorphically {ForAll Scribble proc {$ Each} {Each draw()} in {Each rMoveTo(100 100)} {Each draw()} end } %% access a rectangle specific function Arect = {New Rectangle init(0 0 15 15)} {Arect setWidth(30)} {Arect draw()} end end {TryMe} |
'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 '30', height '15 |