2014-07-11 170 views
1

构造函数的参数我有以下的类模型:抽象类与斯卡拉

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) 
} 

,我得到以下错误:

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) { 
       ^

我在做什么错?

编辑:请求看片类,添加在这里:

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 
} 
+0

你是什么斯卡拉的版本? – vptheron

+0

你可以分享你的瓷砖和瓷砖类吗?这将是有益的REPL它:) –

+0

瓷砖已包括,我会添加件 –

回答

4

你的抽象类Tile声明val coordinate,使得该值可公开访问的。你的案例类别EmptyTile隐含地声明coordinate也是一个值(案例类“魔术”)。基本上,你的case类有效地试图覆盖你的抽象类已经提供的值。

您可以删除抽象类声明中的val,也可以不删除EmptyTileOccupiedTile个案类。

编辑:评论后提出的备选:

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) 
} 
+0

如果我删除我的抽象类中的val - 它会是一个var?或者它会不会在基类中存在?我想我可以摆脱案件分类,但这真的很糟糕... –

+0

@AmirAfghani不,它不会是一个'var',它不会被使用,因为构造函数实际上并没有做任何事情它。如果你想在'Tile'中访问它,我建议从构造函数中移除它并在其中声明'def coordinate:Int'(abstract)。然后你可以保留你的案例班。 –

+0

@AmirAfghani在你的评论后看到我的编辑。 – vptheron

1

case class会自动将其参数val秒。这就是为什么参数coordinateEmptyTile(理解为val coordinate)与抽象类的val coordinate冲突的原因。

修复此问题的一种方法是将coordinateisOccupied定义为在Tile中的摘要。 Tile甚至可以是一个特性,而不是一个抽象类:

sealed trait Tile { 
    def coordinate: Int 
    def isOccupied: Boolean 
    ... 
} 

case class EmptyTile(coordinate: Int) extends Tile { 
    def isOccupied = false 
    ... 
} 

case class OccupiedTile(coordinate: Int, piece: Piece) extends Tile { 
    def isOccupied = true 
    ... 
} 
+0

感谢您的回答。如果让Tile成为一个特征,而不是像名词那样的“名词”,这似乎不是错误的吗?看起来好像抽象类与案例类覆盖在Scala中不是开发者友好的。 +1作为答案 –

+0

另一种看待它的方式是,对于你的情况,你需要从'Tile'完成的功能可以被完全指定为一个特性(通用接口),所以为什么在特质工作的时候使用一个类就像好?请参阅http://stackoverflow.com/q/1991042/ –

+1

在“名词”与“特质”方面,您可以阅读“EmptyTile extends Tile”,因为“EmptyTile”是“Tile”和“Tile”是有这些属性的东西“...我不确定那是什么不是名词般的。 –