2015-10-20 108 views
0

我很難理解如何讓下面的代碼結構工作。斯卡拉,類使用可變var,更新覆蓋方法

在Scala中我有一個類MyClassSomeClass繼承我加在這種情況下var成員變量稱爲mutableArray和它在重寫方法overridingSomeClassMethod被更新,並且當我創建MyClass一個數的新實例被稱爲的時間。但在main當我嘗試並獲取更新的mutableArray變量時,它將打印出實例化的var,就好像它不可變或只在覆蓋方法中具有範圍一樣。

我不能改變父母SomeClass中的方法,並且我嘗試創建伴隨對象以及將該變量放在包含SomeOtherObject中,但我得到了同樣的問題。

import scala.collection.mutable.ArrayBuffer 

object SomeOtherObject{ 
    case MyClass(...) extends SomeClass(..){ 
    var mutableArray: ArrayBuffer[Int] = ArrayBuffer.fill(5)(0) 

    def overridingSomeClassMethod(...){ 
     var someReturnVar = 0.0 
     mutableArray(0) += 1 
     println(mutableArray.mkString) // last output -> 84169 
     someReturnVar 
    } 
    } 

    def main(args: Array[String]){ 
    var mc = new MyClass 
    println(mc.mutableArray.mkString) // output -> 00000 
    } 
} 

回答

1

您可以使用early initializer

case MyClass(...) extends { 
    var mutableArray: ArrayBuffer[Int] = ArrayBuffer.fill(5)(0) 
} with SomeClass(..) { 
+0

我想這一點,但由於「高清overridingSomeClassMethod 「我得到以下錯誤」早期對象初始化部分中只允許使用具體的字段定義「,我假設在子類實例化後,我不需要任何其他選項來創建一個方法來運行? – h1vpdata

+1

適用於我:http://scastie.org/12697。請注意'def overridingSomeClassMethod'不在早期的初始化部分。 –

+0

您的代碼編譯並運行,我相信我非常密切地關注它,我也從2.10.5升級到2.11.4(這是我可以升級到最高級別而無需破壞構建),但它仍然無法工作。如果這是真的(@亞歷克斯,如果你可以確認),比我認爲問題已解決? – h1vpdata

1

也許你正在觸及關於初始化順序的臭名昭着的「one question FAQ」。

如果該方法由超類構造函數調用,那麼在此之後發生初始化,將數據重置爲零。

+0

鏈接:http://docs.scala-lang.org/tutorials/FAQ/initialization-order.html –