moonbit官网首页表明,支持面向对象编程范式,请问struct继承扩展、trait继承扩展怎么弄?与java、rust、中的概念相较,大概怎样?
MoonBit 的 trait 和 Rust 的 trait、Java 的 interface 比较像。
面向对象这个词本身有很多不同的定义,MoonBit 有的面向对象功能是 dynamic dispatch,是通过 trait object 这个功能实现的,在文档里有描述。下面是一个例子:
trait Animal {
speak(Self) -> Unit
}
fn init {
// 这个数组里装着不同类型(Duck 和 Fox)的值,它们的共同点是都实现了 trait Animal
let animals : Array[Animal] = [ Duck::Duck("A"), Fox::Fox("B") ]
// 这里的 speak 是在运行时动态解析的
animals.iter(fn { animal => animal.speak() })
}
type Duck String
fn Duck::speak(self : Duck) -> Unit {
let name = self.0
println("duck \(name)")
}
type Fox String
fn Fox::speak(self : Fox) -> Unit {
let name = self.0
println("fox \(name)")
}
MoonBit 的 trait 支持 super trait,类似 Java interface 的继承。语法是 trait I : Super { ... }
,可以有多个 super trait。Super trait 和 trait object 组合起来可以实现一种类似对象继承的效果(sub trait 的 object 可以被自动转成 super trait 的 object)。
MoonBit 目前不支持具体类型如 struct
的继承。