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