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
直接書くことができますが、私が間違っていなければ同じ意味です。私は正しいですか?そうでない場合、それらはどのように異なりますか。もしそうなら、なぜ誰もが明示的に型付けされた自己参照を使用しているように見えるのですか?