import std.math.*
public interface HasArea {
func getArea(): Float64
prop area: Float64 {
get() {
getArea()
}
}
}
public interface HasPerimeter {
func getPerimeter(): Float64
prop perimeter: Float64 {
get() {
getPerimeter()
}
}
}
class Circle <: HasArea & HasPerimeter {
public Circle(let radius: Float64) {}
public func getArea(): Float64 {
radius * radius * Float64.PI
}
public func getPerimeter(): Float64 {
radius * 2.0 * Float64.PI
}
}
open class Rectangle <: HasArea & HasPerimeter {
public Rectangle(let width: Float64, let height: Float64) {}
public func getArea(): Float64 {
width * height
}
public func getPerimeter(): Float64 {
(width + height) * 2.0
}
}
class Square <: Rectangle {
public Square(let side: Float64) {
super(side, side)
}
}
func printArea(shape: HasArea) {
"Area: ${shape.getArea()}" |> println
}
func printPerimeter(shape: HasPerimeter) {
"Perimeter: ${shape.getPerimeter()}" |> println
}
main() {
let circle = Circle(5.0)
let rectangle = Rectangle(4.0, 6.0)
let square = Square(7.0)
circle |> printArea
circle |> printPerimeter
rectangle |> printArea
rectangle |> printPerimeter
square.area |> println
square.perimeter |> println
}