2017-09-27 7 views
0

の場合、valエラーへの再割り当て次のコードでは、スカラから「再割り当てからvalへ」エラーがスローされます。スカラーでの基本クラスのvarメンバーが

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

私がここで逃したものは何ですか?

答えて

3

最初はcase classを最終とみなし、拡張しないでください。

varcase 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) 
} 
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として彼の答えに示唆されているように、ケースクラスを継承することは避けるべきです。それらは構文的な砂糖であり、コード生成は継承を超えて機能しません。コンパイルクラスのapplyまたはunapplyメソッドのようなすべての面白いものをすべて自分で実装する必要があります。 Scalaコンパイラチームは、ケースクラスからケースクラスへの継承をサポートしようとしましたが、構造上の等価性や他の多くの事柄を破壊することを発見しました。

関連する問題