当Scala中基类的VAR成员时,将其重新分配给Val误差



scala将"重新分配到val"错误为以下代码。

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

我在这里错过了什么?

对于初学者,您应该将 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)
}

您是指由Pistol主构造函数参数生成的bulletCount字段。要设置基类变量,您需要使用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
  }
}

在旁注,正如弗雷德里克·A(FredericA)所建议的那样,您应该避免继承案例类。它们是句法糖,而代码生成也不适用于继承 - 您需要在同伴类中实现所有花哨的东西,例如applyunapply方法。Scala编译器团队试图将案例类支持到案例类继承,但发现它破坏了结构平等和许多其他事情。

最新更新