Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 对单例对象使用stackable trait_Scala_Singleton_Traits - Fatal编程技术网

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
移动到不同的类/特征。