接口继承问题

接口继承了之后,我明明在子接口中实现了父接口的方法,为啥实现子接口,依然要求必须要实现父接口方法,不实现就不行呢?如果是这样设计的话,那接口继承的目的是什么?

trait Trait1{
  trait1Value(Self)->Int
}

trait Trait2: Trait1{
  trait1(Self)->Trait1
  trait2Value(Self)->Int
}

impl Trait1 for Trait2 with trait1Value(self)->Int{
  self.trait1().trait1Value()
}

struct TestData1{
  x: Int
}

impl Trait1 for TestData1 with trait1Value(self)->Int{
  self.x + 30
}

struct TestData2{
  data1: TestData1
  data2: Int
}
impl Trait2 for TestData2 with trait2Value(self)->Int{
  self.data1.x + self.data2
}
impl Trait2 for TestData2 with trait1(self)->Trait1{
  self.data1
}

//为啥这个必须要实现,Trait2接口明明已经实现了Trait1接口的方法?
// impl Trait1 for TestData2 with trait1Value(self)->Int{
//   self.data1.x + 50
// }

fn main {
  let t1: TestData1={x: 30}
  if Trait1::trait1Value(t1) == 60{
    println("OK")
  }
  let t2: TestData2={
    data1: t1,
    data2: 40
  }
  let _= Trait1::trait1Value(t2)
  let _= Trait2::trait2Value(t2)
  println(@lib.hello())
}

impl Trait1 for Trait2 这个写法的意思是 “给 trait object 类型 Trait2(相当于 Rust 里的 dyn Trait2)实现 Trait1”,这个暂时不支持。

你想要的效果如果是 “给所有实现了 Trait1 的类型提供一个 Trait2 的默认实现” 的话,这个可以用 MoonBit 的默认实现语法来做到:

impl Trait2 with trait2value(self) { self.trait1Value() }

由于 Trait1Trait2 的 super trait,所以在默认实现内,self 是实现了 Trait1 的,可以使用 .trait1Value()

你的代码里的逻辑是反过来的,是给所有实现了 sub trait 的类型自动实现 super trait。这个现在是不支持的。但因为 MoonBit 里实现 trait 是逐个方法实现的,所以可以改成我上面说的,给所有实现了 super trait 的类型实现 sub trait 里的 trait2Value 方法。这样用户需要实现的最小方法集合从 Trait2::trait1Trait2::trait2value 变成了 Trait2::trait1Trait1::trait1Value,其实没有什么区别

那估计就是不行了,我想要的目的就是类似于面向对象的继承,写一个基类,基类,基类实现了很多方法,然后子类可以重写基类的,这样,子类扩充的话,只用类似于面向对象重载需要的函数就行了嘛,基类肯定会提供一堆的虚函数,要不然每次都要来把默认得不需要实现得函数都去实现一遍啊,这个只能反着来啊
先直接给基接口直接实现一系列的默认函数得了

如果你的 class hierarchy 只有一层(抽象基类 => 具体衍生类)的话,那基类用 trait,衍生类直接用普通类型就行。如果 class hierarchy 不止一层,而且中间有些既有具体实现又有虚函数的类的话,可能就不行