2013-05-07 7 views
13

私は、コンストラクタのTraitで1つの可変変数を上書きしたいと思います。しかし、 "Int型の特性Aで変数aを上書きすると、変数aは可変変数を上書きできません"という文句があります。なぜスカラーが私にそれを許さないのですか?そして、このためのベストプラクティス?おかげTraitのscalaで可変変数を上書きする方法は?

trait A{ 
    var a:Int = _ 
} 

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

あなたは質問をするためにあなたの本当のケースを簡素化しましたか?多くの答えから指摘されているように、varを同じ名前と型の別のもので上書きするのはかなり役に立たない。 –

答えて

11

あなたは(VARSはなぜそれらを上書きとにかく変更可能であること、を除いて、今の私には自分自身を明らかにしない理由のために)それを上書きすることはできませんが、宣言された変数初期化されていないと、デリゲートを残すことができます後者へ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ではありません。また、単にゲッターとセッター抽象を残すことがあります。

trait A { 
    def a: Int 
    def a_=(value: Int): Unit 
} 

class B(var a: Int) 

その後、あなたは「オーバーライド」への試み「VAR」では達成したいまさに確か

trait A { 
    var a: Int 
} 
1

注意に相当しますとにかくあなたが変えることができると他の人が言いました。

他の多くの推測の中で、1つは自己タイプのメンバーのようなものが欲しいということですか?自己型注釈を使用すると、mixinの特性やクラスのメンバーにアクセスでき、Scalaコンパイラはすべての依存関係が正しく配線されていることを保証しますか?もしそうなら、次のようなものが動作します。

trait B{ 
var a:Int = _ 

}

trait A{self:B=> var b= a} 
class C extends A with B 
関連する問題