1

ソースを変更できないクラスがあります。

class Foo {

  def bar() = println("bar")

}

そして、実行時に混ぜたい特性

trait Zee { this: Foo =>

  abstract override def bar() = {
    println("before bar")
    super.bar()
  }
}

これはそれを投げていますbar is not a member of Object with ScalaObject

私は何を間違っていますか?Fooソースを変更せずにこれを達成することは可能ですか?

最終的なクライアント コードは次のようになります。

val foo = new Foo with Zee
foo.bar() // should print 'before bar' and then 'bar'
4

3 に答える 3

5

Zee トレイトにはスーパー トレイトがないため (ScalaObject からの暗黙の継承を除く)、スーパーには定義が含まれておらず、barオーバーライドまたは呼び出し (super.bar) はありません。

自己言及せずにこれを書いてみませんか?

class Foo {

  def bar() = println("bar")

}


trait Zee extends Foo {

  abstract override def bar() = {
    println("before bar")
    super.bar()
  }
}
于 2012-08-14T14:28:22.130 に答える
3

トレイトでクラス Foo を拡張するだけです:

trait Zee extends Foo

そして、あなたのコードは機能します。

于 2012-08-14T14:28:54.310 に答える
2

あなたの特性はextendfooする必要があります

trait Zee extends Foo {
  abstract override def bar() = {
    println("before bar")
    super.bar()
  }
}
于 2012-08-14T14:29:23.657 に答える