8

与えられた 2 つの独立した特性:

trait T1 {
    def x = 42
}

trait T2 {
    def x = 0
}

これらの 2 つの特性が混在するクラスを定義しようとすると、次のようになります。

class C extends T1 with T2

コンパイラ エラーが発生します。

error: overriding method x in trait T1 of type => Int;
method x in trait T2 of type => Int needs `override' modifier
class C extends T1 with T2
      ^
one error found

ここで、T1 と T2 が個別に開発されたとします。したがって、何もオーバーライドしないため、オーバーライドはありません。では、C はどのように定義できますか? このような:

class C extends T1 with T2 {
    override def x = super.x
}

?

4

1 に答える 1

10

これはダイヤモンド問題として知られています。Scala では、これを解決する方法が 2 つあります。

trait T1 {
  def x = 0
}

trait T2 {
  def x = 42
}

class C extends T1 with T2 {
  override def x = super.x
}

class D extends T2 with T1 {
  override def x = super.x
}

Scala は最後にミックスした trait の実装を使用するためnew C().x、今呼び出すと得られます。ちなみに譲ります。つまり、ひし形の問題を解決するには、使用する実装を明示的に定義する必要があります。42new D().x0

他の方法は次のとおりです。

trait T {
  def x: Int
}

trait T1 extends T {
  override def x = 0
}

trait T2 extends T {
  override def x = 42
}

class C extends T1 with T2

T2 は最後に混合されたトレイトであるため、への呼び出しnew C().xは引き続き生成されます。違いは、 in で42定義する必要がないことです。xC

于 2010-05-05T11:26:34.990 に答える