接口、类及继承

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
}