将可堆叠特征与单例对象一起使用

Using stackable trait with singleton object

我的情况和这个问题有点相似:

Can the stackable trait pattern be used with singleton objects?

但差别很小。我所拥有的可以简化为以下形式:

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()
  }
}

现在我真的很想有一个单例对象来检查常量,并根据它以下列方式采取一些进一步的行动:

class ImplPr extends Pr with PrePostPr {
  def pr() = if(NUMERIC_VAR > 5) println("Foo") else println("Bar")
}

object Foo extends ImplPr
Foo.pr()

不幸的是,上面的代码无法编译——我得到:

method pr needs `override' modifier

是否有任何解决方法可以使此解决方案起作用?

如果您将 NUMERIC_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