2017-09-27 83 views

回答

3

對於初學者,您應該考慮將case class作爲final,而不是將其擴展。

其次,不要使用varcase class,你應該創建一個case class的副本來改變它的一個領域。

第三,如果你想要一個普通的類型,你可以使用一個基礎特徵。

於一身,這裏是它可能是什麼樣子:

sealed trait Gun { 
    def bulletCount: Int 
} 

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

你指的是由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方法的類似方法。斯卡拉編譯器團隊試圖支持案例類繼承案件類,但發現它打破了結構上的平等和許多其他的事情。

相關問題