繼承我斯卡拉如何可以覆蓋二傳手在基地特質定義var
?此代碼似乎對我不起作用:爲`var`覆蓋二傳手從特質
trait A {
var value: Int = _
}
class B extends A {
def value_(newValue: Int) = {
value = newValue
//other logic
}
}
繼承我斯卡拉如何可以覆蓋二傳手在基地特質定義var
?此代碼似乎對我不起作用:爲`var`覆蓋二傳手從特質
trait A {
var value: Int = _
}
class B extends A {
def value_(newValue: Int) = {
value = newValue
//other logic
}
}
你不能比另一個var
以外的任何重寫var
。您可以實現一個var
與getter/setter方法對,但是不會超過一個。所以這個工程:
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的一部分,有效,你無法執行輸入值的驗證。
(這可以說是一個bug,或者至少不一致的,它以這種方式工作;如果你有一個var
它有一定的道理,以確保它是只是優化原因var
不過,如果性狀沒有。實現它自己,爲什麼要這件事?)
我想添加到雷克斯·科爾的回答,您可以通過顯式地繞過限制,如果你可以通過聲明爲顯式訪問您的變量的方法來修改的特點,和沒有問題重寫他們:
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 = _;
}