2013-07-20 64 views
3

繼承我斯卡拉如何可以覆蓋二傳手在基地特質定義var?此代碼似乎對我不起作用:爲`var`覆蓋二傳手從特質

trait A { 
    var value: Int = _ 
} 


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

回答

6

你不能比另一個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不過,如果性狀沒有。實現它自己,爲什麼要這件事?)

2

我想添加到雷克斯·科爾的回答,您可以通過顯式地繞過限制,如果你可以通過聲明爲顯式訪問您的變量的方法來修改的特點,和沒有問題重寫他們:

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 = _; 
}