scala将"重新分配到val"错误为以下代码。
abstract case class Gun(var bulletCount:Int)
class Pistol(bulletCount:Int) extends Gun(bulletCount){
def fire() { bulletCount=bulletCount-1 }
}
我在这里错过了什么?
对于初学者,您应该将 case class
视为最终,而不是扩展。
第二,请勿将var
与case 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)所建议的那样,您应该避免继承案例类。它们是句法糖,而代码生成也不适用于继承 - 您需要在同伴类中实现所有花哨的东西,例如apply
或unapply
方法。Scala编译器团队试图将案例类支持到案例类继承,但发现它破坏了结构平等和许多其他事情。