2014-07-11 165 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」是有這些屬性的東西「...我不確定那是什麼不是名詞般的。 –