moonbit官网表明支持面向对象编程范式,请问怎么弄struct继承扩展、trait继承扩展?

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 的继承。