在scala中基类的var成员时重新分配给val错误

时间:2017-09-27 04:28:10

标签: scala inheritance

Scala会针对以下代码抛出“重新分配给val”错误。

abstract case class Gun(var bulletCount:Int)
class Pistol(bulletCount:Int) extends Gun(bulletCount){
def fire() { bulletCount=bulletCount-1 }
}

我在这里错过了什么?

2 个答案:

答案 0 :(得分:3)

对于初学者,您应该将case class视为最终版,而不是扩展它们。

其次,不要将varcase class一起使用,您应该创建case class的副本以更改其中一个字段。

第三,如果你想要一个普通类型,你可以使用一个基本特征。

一体化,这就是它的样子:

sealed trait Gun {
  def bulletCount: Int
}

case class Pistol(bulletCount: Int) extends Gun {
  def fire(): Pistol = copy(bulletCount=bulletCount)
}

答案 1 :(得分:0)

您指的是bulletCount主构造函数参数生成的Pistol字段。要设置基类变量,您需要使用super

直接调用字段
class Pistol(bulletCount: Int) extends Gun(bulletCount) {

  def fire(): Unit = {
    super.bulletCount = super.bulletCount - 1 
  }
}

或者,您可以使用override var标记参数生成的字段:

class Pistol(override var bulletCount: Int) extends Gun(bulletCount) {

  def fire(): Unit = {
    bulletCount = bulletCount - 1
  }
}

另一方面,正如Frederic A.在答案中建议的那样,你应该避免继承案例类。它们是语法糖,代码生成不会继承 - 你需要自己在伴侣类中实现所有花哨的东西,如applyunapply方法。 Scala编译器团队试图支持case类到case类的继承,但发现它破坏了结构相等性和许多其他东西。