2013-05-07 50 views
13

我想重寫構造函數Trait中的一個可變變量。但它會抱怨說「重寫Int類型的特徵A中的變量a;變量a不能重寫一個可變變量」。爲什麼斯卡拉不允許我這樣做?對此有什麼最佳做法?由於如何在Scala中重寫Trait中的可變變量?

trait A{ 
    var a:Int = _ 
} 

class B(override var a:Int) extends A 
+1

你簡化你的真實情況,使這個問題?正如很多答案指出的那樣,用另一個相同的名稱和類型覆蓋var是非常沒有用的。 – 2013-05-08 08:29:06

回答

11

你不能覆蓋它(爲不暴露自己的身份我現在,除了原因,增值經銷商可無論如何修改,爲什麼覆蓋它們),但你可以離開這個聲明的變量未初始化和委託後者到B

trait A { 
    var a: Int 
} 

class B(var a: Int) extends A 
6

重寫僅適用於方法。重寫一個變量沒有意義。如果用另一個相同類型的變量覆蓋變量,會發生什麼變化?如果有的話,該值和正好可以隨時設定無論如何,因爲它是一個變量:

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 
} 
1

注意確切知道你想實現與企圖「超越」了「變種」是什麼正如其他人所說,你可以改變。

在許多其他猜測中,其中一個是你想要類似自我類型的成員?自我類型註釋允許您訪問mixin特徵或類的成員,並且Scala編譯器確保所有依賴關係都正確連接?如果是這樣,像下面這樣的東西將工作。

trait B{ 
var a:Int = _ 

}

trait A{self:B=> var b= a} 
class C extends A with B