open class A {
let x: Int32
init(x: Int32) {
this.x = x
}
open func print(): Unit {
print("A: ${x}\n")
}
operator func *(right: A) {
return A(this.x * right.x)
}
}
class B <: A {
init(x: Int32) {
super(x)
}
override func print(): Unit {
print("B: ${x}\n")
}
operator func *(right: B) {
return B(this.x * right.x)
}
}
extend A {
operator func +(right: A) {
return A(this.x + right.x)
}
}
extend B {
operator func +(right: B) {
return B(this.x + right.x)
}
}
func main() {
let a = A(10)
a.print()
let b = B(10)
b.print()
let c = a * b
c.print()
let c2 = b * a
c2.print()
let c3 = b * b
c3.print()
let d = a + b
d.print()
let d2 = b + a
d2.print()
let d3 = b + b
d3.print()
}