就是有一个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())