我想重寫構造函數Trait中的一個可變變量。但它會抱怨說「重寫Int類型的特徵A中的變量a;變量a不能重寫一個可變變量」。爲什麼斯卡拉不允許我這樣做?對此有什麼最佳做法?由於如何在Scala中重寫Trait中的可變變量?
trait A{
var a:Int = _
}
class B(override var a:Int) extends A
我想重寫構造函數Trait中的一個可變變量。但它會抱怨說「重寫Int類型的特徵A中的變量a;變量a不能重寫一個可變變量」。爲什麼斯卡拉不允許我這樣做?對此有什麼最佳做法?由於如何在Scala中重寫Trait中的可變變量?
trait A{
var a:Int = _
}
class B(override var a:Int) extends A
你不能覆蓋它(爲不暴露自己的身份我現在,除了原因,增值經銷商可無論如何修改,爲什麼覆蓋它們),但你可以離開這個聲明的變量未初始化和委託後者到B
:
trait A {
var a: Int
}
class B(var a: Int) extends A
重寫僅適用於方法。重寫一個變量沒有意義。如果用另一個相同類型的變量覆蓋變量,會發生什麼變化?如果有的話,該值和正好可以隨時設定無論如何,因爲它是一個變量:
trait A {
var a: Int = _
}
class B (a0: Int) extends A {
a = a0
}
但是,這propably不是你想要的。你也可能只是離開getter和setter摘要:
trait A {
def a: Int
def a_=(value: Int): Unit
}
class B(var a: Int)
,然後將其等同於
trait A {
var a: Int
}
注意確切知道你想實現與企圖「超越」了「變種」是什麼正如其他人所說,你可以改變。
在許多其他猜測中,其中一個是你想要類似自我類型的成員?自我類型註釋允許您訪問mixin特徵或類的成員,並且Scala編譯器確保所有依賴關係都正確連接?如果是這樣,像下面這樣的東西將工作。
trait B{
var a:Int = _
}
trait A{self:B=> var b= a}
class C extends A with B
你簡化你的真實情況,使這個問題?正如很多答案指出的那樣,用另一個相同的名稱和類型覆蓋var是非常沒有用的。 – 2013-05-08 08:29:06