似乎 Scala显式类型的自引用最常见的用法是在“蛋糕模式”中,其中模块的依赖项声明如下:
class Foo { this: A with B with C =>
// ...
}
一般来说,暂时忽略蛋糕模式,,A
可以引用任何类型级别的东西,例如类型参数:B
C
class Outer[A, B, C] {
class Inner { this: A with B with C =>
// ...
}
}
...或抽象类型成员:
class Outer {
type A
type B
type C
class Inner { this: A with B with C =>
// ...
}
}
在这两种情况下,我们都不能写,abstract class Inner extends A with B with C
因为和不知道是特征。这里需要显式类型的自引用。但是,我只见过带有特征的蛋糕图案:A
B
C
trait A { def a }
trait B { def b }
trait C { def c }
class Foo { this: A with B with C =>
// ...
}
在这种情况下,我们可以abstract class Foo extends A with B with C
直接写,如果我没记错的话,意思是一样的。我对么?如果不是,那么它们有何不同;如果是这样,为什么每个人似乎都使用显式类型的自我引用?