Contributed by Chris Rathman
class TRYME inherit ANY creation make feature make is local i: INTEGER ashape: SHAPE scribble: ARRAY[SHAPE] arect: RECTANGLE do -- create some shape instances !!scribble.make(0, 1) !RECTANGLE!ashape.make_rectangle(10, 20, 5, 6) scribble.put(ashape, 0) !CIRCLE!ashape.make_circle(15, 25, 8) scribble.put(ashape, 1) -- iterate through the list and handle shapes polymorphically from i := scribble.lower until i > scribble.upper loop scribble.item(i).draw scribble.item(i).rmoveto(100, 100) scribble.item(i).draw i := i + 1 end -- call a rectangle specific function !!arect.make_rectangle(0, 0, 15, 15) arect.setwidth(30) arect.draw end end |
deferred class SHAPE feature x: INTEGER; y: INTEGER; -- constructor make_shape(newx: INTEGER; newy: INTEGER) is do moveto(newx, newy) end -- accessors for x & y getx: INTEGER is do Result := x end gety: INTEGER is do Result := y end setx(newx: INTEGER) is do x := newx end sety(newy: INTEGER) is do y := newy end -- move the x & y position moveto(newx: INTEGER; newy: INTEGER) is do setx(newx) sety(newy) end rmoveto(deltax: INTEGER; deltay: INTEGER) is do moveto(getx + deltax, gety + deltay) end -- abstract draw method draw is deferred end end |
class RECTANGLE inherit SHAPE creation make_rectangle feature width: INTEGER; height: INTEGER; -- constructor make_rectangle(newx: INTEGER; newy: INTEGER; newwidth: INTEGER; newheight: INTEGER) is do make_shape(newx, newy) setwidth(newwidth) setheight(newheight) end -- accessors for the width & height getwidth: INTEGER is do Result := width end getheight: INTEGER is do Result := height end setwidth(newwidth: INTEGER) is do width := newwidth end setheight(newheight: INTEGER) is do height := newheight end -- draw the rectangle draw is do io.put_string("Drawing a Rectangle at:(") io.put_integer(x) io.put_string(",") io.put_integer(y) io.put_string("), width ") io.put_integer(width) io.put_string(", height ") io.put_integer(height) io.put_string("%N") end end |
class CIRCLE inherit SHAPE creation make_circle feature radius: INTEGER; -- constructor make_circle(newx: INTEGER; newy: INTEGER; newradius: INTEGER) is do make_shape(newx, newy) setradius(newradius) end -- accessors for the radius getradius: INTEGER is do Result := radius end setradius(newradius: INTEGER) is do radius := newradius end -- draw the circle draw is do io.put_string("Drawing a Circle at:(") io.put_integer(x) io.put_string(",") io.put_integer(y) io.put_string("), radius ") io.put_integer(radius) io.put_string("%N") end end |
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 |