3

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

trait A {
  var value: Int = _
}


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

2 回答 2

6

您不能用 avar以外的任何东西覆盖 another var。您可以使用 getter/setter 对来实现a 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.") }
}

如果你不能修改 trait,那么你就陷入了困境——它实际上是 trait 的 API 的一部分,你不能对值执行输入验证。

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

于 2013-07-20T22:04:03.920 回答
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 = _;
}
于 2013-07-21T06:58:56.580 回答