覆盖从trait继承的`var`的setter

时间:2013-07-20 21:51:12

标签: scala

如何在Scala中覆盖基本特征中定义的var的setter?这段代码似乎对我不起作用:

trait A {
  var value: Int = _
}


class B extends A {
  def value_(newValue: Int) = { 
    value = newValue
    //other logic 
  }
}

2 个答案:

答案 0 :(得分:6)

您无法使用其他var以外的任何内容覆盖var。您可以使用getter / setter对实现 var,但不能覆盖一个。所以这有效:

trait A { var value: Int }
class B extends A {
  def value = 5
  def value_=(v: Int) { println(s"You like $v, but I like 5.") }
}

如果你不能修改这个特性,你就会有点绑定 - 它是特征的API的一部分,实际上,你不能执行输入验证价值。

(可以说这是一个错误或至少不一致,它以这种方式工作;如果你有一个var,那么确保它只是一个var是有道理的出于优化原因。但是如果特性本身没有实现它,那为什么要重要呢?)

答案 1 :(得分:2)

我想补充Rex Kerr的答案,如果您可以通过明确声明访问变量的方法来修改特征,那么您可以明确地绕过限制,并且没有问题覆盖它们:

trait A {
  private[this] var _value: Int = _;
  def value: Int = _value;
  def value_=(v: Int) { _value = v; };
}


class B extends A {
  override def value_=(newValue: Int) = {
    super.value = newValue;
    //other logic
  }
}

class C extends A {
  override var value: Int = _;
}