の場合、valエラーへの再割り当て次のコードでは、スカラから「再割り当てからvalへ」エラーがスローされます。スカラーでの基本クラスのvarメンバーが
abstract case class Gun(var bulletCount:Int)
class Pistol(bulletCount:Int) extends Gun(bulletCount){
def fire() { bulletCount=bulletCount-1 }
}
私がここで逃したものは何ですか?
の場合、valエラーへの再割り当て次のコードでは、スカラから「再割り当てからvalへ」エラーがスローされます。スカラーでの基本クラスのvarメンバーが
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
のコピーを作成して、フィールドの1つを変更する必要があります。
第3に、共通タイプが必要な場合は、基本特性を使用できます。 1で
すべてが、ここでは次のようになります:
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として彼の答えに示唆されているように、ケースクラスを継承することは避けるべきです。それらは構文的な砂糖であり、コード生成は継承を超えて機能しません。コンパイルクラスのapply
またはunapply
メソッドのようなすべての面白いものをすべて自分で実装する必要があります。 Scalaコンパイラチームは、ケースクラスからケースクラスへの継承をサポートしようとしましたが、構造上の等価性や他の多くの事柄を破壊することを発見しました。