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

时间:2016-07-15 14:15:31

标签: scala singleton traits

我的情况与这个问题有点类似:

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

不幸的是,上面的代码没有编译 - 我得到了:

  

方法pr需要`覆盖'改性剂

是否有解决方法使此解决方案有效?

1 个答案:

答案 0 :(得分:2)

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