Scala 对单例对象使用stackable trait
我的情况有点类似于这个问题: 但差别不大。我所拥有的可以简化为以下形式:Scala 对单例对象使用stackable trait,scala,singleton,traits,Scala,Singleton,Traits,我的情况有点类似于这个问题: 但差别不大。我所拥有的可以简化为以下形式: abstract class Pr { def pr() } trait PrePostPr extends Pr { var NUMERIC_VAR: Int = _ abstract override def pr() { NUMERIC_VAR = 5 // number is being extracted eg. from conf file super.pr() } } 现
abstract class Pr {
def pr()
}
trait PrePostPr extends Pr {
var NUMERIC_VAR: Int = _
abstract override def pr() {
NUMERIC_VAR = 5 // number is being extracted eg. from conf file
super.pr()
}
}
现在我真的希望有一个singleton对象,它将检查常量,并根据它以以下方式采取进一步的操作:
class ImplPr extends Pr with PrePostPr {
def pr() = if(NUMERIC_VAR > 5) println("Foo") else println("Bar")
}
object Foo extends ImplPr
Foo.pr()
不幸的是,上面的代码没有编译-我得到:
方法pr需要“重写”修饰符
是否有任何解决方案可以使此解决方案起作用?如果您将
数值\u VAR
移动到另一个特性,它将起作用:
trait NumericVarHolder {
var NUMERIC_VAR: Int = _
}
abstract class Pr {
def pr()
}
trait PrePostPr extends Pr {
self: NumericVarHolder =>
abstract override def pr() {
NUMERIC_VAR = 5 // number is being extracted eg. from conf file
super.pr()
}
}
class ImplPr extends Pr with NumericVarHolder {
def pr() = if(NUMERIC_VAR > 5) println("Foo") else println("Bar")
}
object Foo extends ImplPr
如果将
NUMERIC\u VAR
移动到另一个特征,它将起作用:
trait NumericVarHolder {
var NUMERIC_VAR: Int = _
}
abstract class Pr {
def pr()
}
trait PrePostPr extends Pr {
self: NumericVarHolder =>
abstract override def pr() {
NUMERIC_VAR = 5 // number is being extracted eg. from conf file
super.pr()
}
}
class ImplPr extends Pr with NumericVarHolder {
def pr() = if(NUMERIC_VAR > 5) println("Foo") else println("Bar")
}
object Foo extends ImplPr
我认为这在概念上是不可能的。为了让
Foo.pr
访问NUMERIC\u VAR
,它必须在一个类中实现,该类是prepstr
的子类,这反过来意味着它在prepstr.pr()
中永远不会被称为super.pr()
。你可能必须把数值变量转移到另一个类/特征。我认为这在概念上是不可能的。为了让Foo.pr
访问NUMERIC\u VAR
,它必须在一个类中实现,该类是prepstr
的子类,这反过来意味着它在prepstr.pr()
中永远不会被称为super.pr()
。您可能必须将NUMERIC\u VAR
移动到不同的类/特征。