type Point fun default = Point by block do return Point(0, 0) end fun copy = Point by Point p do return Point(p.getX(), p.getY()) end fun byX = Point by int x do return Point(x, 0) end fun byCoords = Point by int x, int y do return Point(x, y) end model int x, y new by int x, int y me.x = x me.y = y end fun getX = int by block do return me.x end fun setX = void by int x do me.x = x end fun getY = int by block do return me.y end fun setY = void by int y do me.y = y end fun print = void by block writeLine("I am a Point at (" + me.x + "," + me.y + ")") end end type Circle extends Point fun default = Circle by block do return Circle(0, 0, 0) end fun copy = Circle by Circle c do return Circle(c.getX(), c.getY(), c.getR()) end fun byCenterAndRadius = Circle by Point p, int r do return Circle(p.getX(), p.getY(), r) end fun byCoordsAndRadius = Circle by int x, int y, int r do return Circle(x, y, r) end model int r new by int x, int y, int r :base(x, y) me.r = r end fun getR = int by block do return me.r end fun setR = void by int x do me.r = r end fun print = void by block writeLine("I am a Circle with center at (" + me.x + "," + me.y + ") and radius is " + me.r) end end type Main Point.default().print() Point.copy(Point(32, 32)).print() Point.byCoords(20, 20).print() Point.byX(10).print() Circle.default().print() Circle.copy(Circle(18, 18, 6)).print() Circle.byCoordsAndRadius(10, 10, 5).print() Circle.byCenterAndRadius(Point(7, 7), 4).print() Point p = Point(20, 20) Point c = Circle(10, 10, 5) Circle c1 = c p.print() c.print() watch(p) watch(c) watch(c1)