RosettaCodeData/Task/Polymorphism/EMal/polymorphism.emal

53 lines
1.6 KiB
Plaintext

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)