我在我的应用程序中使用了Logging trait,我很好奇是否可以从Logging trait中访问受保护的变量。
这就是我所拥有的:
class MyClass extends ExternalTrait with Logging
trait ExternalTrait {
protected val protectedVar = "secret?"
}
trait Logging {
if(this.isInstanceOf[OtherTrait])
this.asInstanceOf[OtherTrait].protectedVar
}
但以这种方式访问时,对受保护变量的访问受到限制。是否有其他方法可以从Logging trait中访问protectedVar?
非常感谢。
答案 0 :(得分: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
}