如何在 Scala 中覆盖var
基本特征中定义的 setter?这段代码似乎对我不起作用:
trait A {
var value: Int = _
}
class B extends A {
def value_(newValue: Int) = {
value = newValue
//other logic
}
}
如何在 Scala 中覆盖var
基本特征中定义的 setter?这段代码似乎对我不起作用:
trait A {
var value: Int = _
}
class B extends A {
def value_(newValue: Int) = {
value = newValue
//other logic
}
}
您不能用 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
我想补充一下 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 = _;
}