Scala中带有构造函数参数的抽象类

Ami*_*ani 3 scala

我有以下类模型:

sealed abstract class Tile(val coordinate: Int, val isOccupied: Boolean) {
  def isEmpty() : Boolean
  def getPiece() : Option[Piece]
}

case class EmptyTile(coordinate: Int) extends Tile(coordinate, false) {
  override def toString: String = "" +coordinate
  override def isEmpty() = true
  override def getPiece() = None
}

case class OccupiedTile(coordinate: Int, val piece: Piece) extends Tile(coordinate, true) {
  override def toString = piece.toString
  override def isEmpty = false
  override def getPiece = Some(piece)
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Error:(6, 22) overriding value coordinate in class Tile of type Int;
 value coordinate needs `override' modifier
case class EmptyTile(coordinate: Int) extends Tile(coordinate, false) {
                 ^
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

编辑:请求查看Piece类,在此处添加:

import Alliance.Alliance
import PieceType.PieceType

abstract class Piece(val piecePosition: Int, val pieceType : PieceType, val alliance: Alliance) extends Movable {
}

object PieceType extends Enumeration {
  type PieceType = Value
  val PAWN, KNIGHT, BISHOP, ROOK, QUEEN, KING = Value
}
Run Code Online (Sandbox Code Playgroud)

vpt*_*ron 5

您的抽象类Tile声明了一个val coordinate,使该值可公开访问.你的case类也EmptyTile隐式声明coordinate为val(case class"magic").基本上,您的case类有效地尝试覆盖抽象类已经提供的值.

您可以删除val抽象类声明,也可以不删除make EmptyTileOccupiedTilecase类.

编辑:评论后建议的备选方案:

trait Tile {
  def coordinate: Int
  def isOccupied: Boolean
  def isEmpty() : Boolean = !isOccupied
  def getPiece() : Option[Piece]
}

case class EmptyTile(coordinate: Int) extends Tile {
  override def toString: String = "" +coordinate
  val isOccupied = false
  def getPiece() = None
}

case class OccupiedTile(coordinate: Int, val piece: Piece) extends Tile {
  override def toString = piece.toString
  val isOccupied = true
  def getPiece = Some(piece)
}
Run Code Online (Sandbox Code Playgroud)