生成trait object的时候增加一个自动映射结构体中实现了对应trait的字段到trait object或者说增加一个queryInterface的函数来作为 as 的重载

就是有一个trait A,然后一个结构structA实现了trait A,然后另外一个结构structB中有structA作为字段,可否提供一种模式,让structB不用写代码自动使用structA实现traitA,比如

trait A{
  f1(Self)->Unit
  f2(Self)->Unit
}
struct StructA{
  field1: Int
  field2: Int
}
impl A for StructA with f1(self)->Unit{
}
impl A for StructA with f2(self)->Unit{
}

struct StructB{
  traitA: StructA
}
//此时可否提供一个方法来自动提供StructB实现trait A,比如使用impl for with
//语法,只不过with后面不接函数接口,接的是StructB的字段traitA,
//表示StructB用traitA这个字段来实现trait A接口,然后StructB就直接可以作为
//trait A来使用了,而不用给StructB来再单独实现trait A的接口函数,我们只用
//根据自己需要来实现需要重载的函数就行,比如下面
impl A for StructB with self.traitA //StructB使用self.traitA来实现 A接口
impl A for StructB with f2(self)->Unit{
   println("StructB调用f1的时候,实际上是A::f1(self.trantA)")
   println("但是f2被重写,调用A接口的f2的时候,调用这里")
}

另外一个就是针对 as 转换到接口的,能否提供一个queryInterface的重载,可以让咱们自己将一个对象转到一个我们需要的接口呢,比如

fn queryInterface[T](Self)->T

fn queryInterface[T:A](self: StructB)->T{
  self.traitA
}

let b: StructB={}
(b as A).f1()//相当于
b.queryInterface().f1()

A::f1(b),相当于A::f1(b.queryInterface())

感觉像 Go 的委托?然后 queryInterface 相当于用一个用户自定义的函数来委托?在 MoonBit 里事情会比 Go 稍微麻烦一点,因为 MoonBit 能写出 equal(T, T) -> Bool 这种签名的方法,但这种方法是没法委托的,因为委托只会转换第一个参数,如果其他地方也出现了 self 的类型,那委托完的类型签名就坏掉了。所以如果要做的话,可能也不会做得这么隐式,会需要把要自动继承哪些 trait 显式列出来

跟go的组合委托还有点不一样,go的模式是组合(没有名称的)了之后,可以直接用当前的访问组合的结构的内容
go是
struct TcpCon{
net.conn
field1 string
field2 string
}
此时TcpCon可以直接访问net.conn这种内部的内容,也算是自动实现了conn接口了,当然,咱们也实现这种方法的话,也木有问题,我是想着,咱们都是用impl模式的话,也可以嘛

impl A for StructB with self.traitA
impl A for StructB with traitA
//这个self要不要都行啊,作为字段,后面没(),可以直接决断到是StructB的字段啊

至于queryInterface这个是根据Windows这一系的COM接口编程中得接口想到的,就是对应相当于你说的一个用户自定义的动态委托,实际上queryInterface能实现的话,就还能实现一个针对函数动态调用比如IDispatch的实现,来针对()的调用折腾一个 invoke的重载,当然这些就是我一个想法,内里是否实现怎么实现,就看你们了,上面queryinterface,以及组合自动实现接口的,我觉得真的挺有用哈,考量能实现的话就好了,至于dispatch invoke这种用户动态分发的,倒是无关紧要