17

以下のコードを検討してください。

trait A {
  def work = { "x" }
}

trait B {
  def work = { 1 }
}

class C extends A with B {
  override def work = super[A].work
}

クラスCは scala 2.10 でコンパイルされません。これは、「型 => String の trait A でメソッド作業をオーバーライドしている; メソッド作業には互換性のない型がある」ためです。

特定の方法を 1 つ選択するにはどうすればよいですか?

4

4 に答える 4

6

そんなことはできません。

このコードを見てください:

val c = new C
val a: A = c
val b: B = c

これらの行の両方が機能する方法はありません。

val s: String = a.work
val i: Int = b.work

そのようなコードのコンパイルを許可した場合、これらの代入の 1 つがClassCastException別の方法でスローされるか、失敗する必要があります。したがって、そのような競合を解決することは不可能です。

何らかの形の委任でこれを回避する必要があると思います。おそらく次のようなものです。

class C extends A {
  def toB = new B {
    //implement B methods by somehow delegating them to C instance
  }
}
于 2013-10-03T07:36:53.620 に答える
6

Scalaではそれができません。

これを回避する方法は、特性を共同作業者として使用することです

trait A {
  def work = { "x" }
}

trait B {
  def work = { 1 }
}

class C {
  val a = new A { }
  val b = new B { }

  a.work
  b.work
}
于 2015-01-25T19:49:49.320 に答える