2015-10-20 78 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 –