Contributed by Chris Rathman
class Shape(x, y) # accessors for x & y coordinates method getX() return x end method getY() return y end method setX(newx) x := newx end method setY(newy) y := newy end # move the x & y coordinates method moveTo(newx, newy) setX(newx) setY(newy) end method rMoveTo(deltax, deltay) moveTo(x + deltax, y + deltay) end # abstract draw method method draw() end end |
class Rectangle : Shape(x, y, width, height) # accessors for the width & height method getWidth() return width end method getHeight() return height end method setWidth(newwidth) width := newwidth end method setHeight(newheight) height := newheight end # draw the rectangle method draw() writes("Drawing a Rectangle at:("); writes(getX()); writes(","); writes(getY()); writes("), width "); writes(getWidth()); writes(", height "); write(getHeight()) end end |
class Circle : Shape(x, y, radius) # accessors for the radius method getRadius() return radius end method setRadius(newradius) radius := newradius end # draw the circle method draw() writes("Drawing a Circle at:("); writes(getX()); writes(","); writes(getY()); writes("), radius "); write(getRadius()) end end |
procedure main() # create a list containing various shape instances scribble := [Rectangle(10, 20, 5, 6), Circle(15, 25, 8)]; # iterate through the list and handle shapes polymorphically every each := !scribble do { each.draw(); each.rMoveTo(100, 100); each.draw(); } # access a rectangle specific function rect := Rectangle(0, 0, 15, 15); rect.setWidth(30); rect.draw(); end |
unicon -c shape.icn unicon -c rectangle.icn unicon -c circle.icn unicon polymorph.icn shape.u rectangle.u circle.u polymorph.exe |
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 |