Scala爲以下代碼引發「重新賦值爲val」錯誤。當scala中的基類的var成員重新賦值爲val時出錯
abstract case class Gun(var bulletCount:Int)
class Pistol(bulletCount:Int) extends Gun(bulletCount){
def fire() { bulletCount=bulletCount-1 }
}
我在這裏錯過的任何東西?
Scala爲以下代碼引發「重新賦值爲val」錯誤。當scala中的基類的var成員重新賦值爲val時出錯
abstract case class Gun(var bulletCount:Int)
class Pistol(bulletCount:Int) extends Gun(bulletCount){
def fire() { bulletCount=bulletCount-1 }
}
我在這裏錯過的任何東西?
對於初學者,您應該考慮將case class
作爲final,而不是將其擴展。
其次,不要使用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.在他的回答中提出,你應該避免繼承案例類。它們是語法糖,代碼生成不能用於繼承 - 您需要自己完成所有類似或unapply
方法的類似方法。斯卡拉編譯器團隊試圖支持案例類繼承案件類,但發現它打破了結構上的平等和許多其他的事情。