4

トレイトがメソッドの具体的な実装を提供する必要があることを指定する方法はありますか?

いくつかの mixin が与えられた場合

class A extends B with C {
  foo()
}

AB、またはのいずれかがC実装されている場合、プログラムはコンパイルされfoo()ます。しかし、たとえばの実装を強制的Bに含めるにはどうすればよいでしょうか。foo

4

1 に答える 1

10

次のことができます。

class A extends B with C {
  super[B].foo()
}

B これは、 implements の場合にのみコンパイルされfooます。ただし、(潜在的に)直感的でない結合が発生するため、注意して使用してください。さらに、Aoverridesの場合foo、 stillが呼び出されます。Bfoo

私見の有効な使用例の 1 つは、競合の解決です。

trait B { def foo() = println("B") }
trait C { def foo() = println("C") }
class A extends B with C {
  override def foo() = super[B].foo()
}

B 確実に宣言し たい場合fooは、型の割り当てを使用できます。

class A extends B with C {
  (this:B).foo()
}

B これは、 が宣言 されている場合にのみコンパイルされます (ただし、またはfooで実装される場合があります)。CA

于 2013-07-25T00:08:26.777 に答える