View Problem

Implement Inheritance Heirarchy

Implement a Shape abstract class which will form the base of an inheritance hierarchy that models 2D geometric shapes. It will have:

* A non-mutable 'name' property or data member set by derived or descendant classes at construction time
* A 'area' method intended to be overridden by derived or descendant classes ( double precision floating point return value)
* A 'print' method (also for overriding) will display the shape's name, area, and all shape-specific values

Two derived or descendant classes will be created:
* Circle    -> Constructor requires a '
radius' argument, and a 'circumference' method to be implemented  
* Rectangle -> Constructor requires '
length' and 'breadth' arguments, and a 'perimeter' method to be implemented 

Instantiate an object of each class, and invoke each objects '
print' method to show relevant details.
abstract class Shape
const Str name
new make(Str name) { = name }
abstract Float area()
abstract Void print()

class Circle : Shape
private Float radius

new make(Float radius) : super("circle") { this.radius = radius }
Float circumference() { return 2 * Float.pi * radius }
override Float area() { return Float.pi * radius.pow(2.0f) }
override Void print()
echo("I am a $name with radius $radius, area $area
and circumference $circumference")

class Rectangle : Shape
private Float length
private Float breadth

new make(Float length, Float breadth) : super("rectangle")
this.length = length
this.breadth = breadth
Float perimeter() { return 2 * (length + breadth) }
override Float area() { return length * breadth }
override Void print()
echo("I am a $name with length $length, breadth $breadth,
area $area and perimeter $perimeter")

circle := Circle(4.0f)
rectangle := Rectangle(2.0f, 5.5f)

Submit a new solution for fantom
There are 14 other solutions in additional languages (clojure, cpp, csharp, fsharp ...)