1

セルフタイプのトレイトがあり、メソッドの1つをオーバーライドしたとします。

trait A {
  def foo() { println("A") }
}

trait B { this: A =>
  override def foo() {
    println("B")
  }
}

object Test {
  def main (args: Array[String]) {
    val b = new A with B {}
    b.foo()
  }
}

これまでのところ、コンパイルして出力に「B」を生成します。しかし、次のようなことを行うために、から「シャドウ」メソッドを呼び出すにはどうすればよいAですか。

trait A {
  def foo() { println("Hello, ") }
}

trait B { this: A =>
  override def foo() {
    //here I'd like to do something like super.foo()
    println("world!")
  }
}

object Test {
  def main (args: Array[String]) {
    val b = new A with B {}
    b.foo() //Should print "Hello, world!"
  }
}

オーバーライドを呼び出すことさえ可能fooですか?または、これを可能にするために、セルフタイプよりも継承を優先する必要がありますか?

4

2 に答える 2

4

探しているのは抽象オーバーライドです。これにより、スタック可能な特性パターンを実装できます。

次のような特性Aでfooを定義する場合

trait A {
  def foo()
}

trait M extends A {
  abstract override def foo() {println("M"); super.foo()}
}

class FooImpl1 extends A {
  override def foo() {println("Impl")}
}

class FooImpl2 extends FooImpl1 with M
于 2012-07-26T12:01:04.293 に答える
2

Edmondoのバージョンに触発されました:

scala> class C { def c = "C" }
defined class C

scala> trait T1 { def c:String }
defined trait T1

scala> trait T2 extends T1 { self:C => 
     | abstract override def c = super.c + " with T2" 
     |}
defined trait T2

scala> new C with T2
res0: C with T2 = $anon$1@1f841222

scala> res0.c
res1: java.lang.String = C with T2
于 2012-07-26T13:34:27.703 に答える