1

アプリケーションで Logging トレイトを使用していますが、Logging トレイトから保護された変数にアクセスできるかどうか知りたいです。

これは私が持っているものです:

class MyClass extends ExternalTrait with Logging

trait ExternalTrait {
  protected val protectedVar = "secret?"
}

trait Logging {
  if(this.isInstanceOf[OtherTrait]) 
    this.asInstanceOf[OtherTrait].protectedVar
}

ただし、この方法でアクセスする場合、保護された変数へのアクセスは制限されます。Logging トレイトから protectedVar にアクセスする他の方法はありますか?

どうもありがとう。

4

1 に答える 1

3

Logging後で混合されることを確実に知っている場合ExternalTraitは、自己参照を配置できます。

trait Logging { this: ExternalTrait =>
  val value = protectedVar
}

もちろん、他の特性を拡張/ミックスインしないロギング特性が存在する可能性がある場合、自己参照は適切ではありません。Loggingそのような場合、私は異なる振る舞いを処理するためにサブクラス化します。

trait Logging
trait StandAloneLogging extends Logging
trait BasedOnLogging extends Logging { this: ExternalTrait =>
  val value = protectedVar
}
于 2012-09-14T11:45:13.690 に答える