2013-10-19 80 views
0

背景接口方法與相同的接口類型的參數作爲聲明類型

我在Java中建立一個國際象棋程序。

問題

我創建了一個名爲IPiece接口類型:

public interface IPiece 
{ 
    boolean isFriendlyTo(IPiece piece); 
    Square[] destinationsFrom(IBasicBoard onBoard, Square fromSquare); 
} 

我實現它是這樣:

public abstract class AbstractChessPiece implements IPiece 
{ 
    private PieceArchetype pieceArchetype; 
    private Color color; 

    public AbstractChessPiece(PieceArchetype pieceArchetype, Color color) 
    { 
     this.pieceArchetype = pieceArchetype; 
     this.color = color; 
    } 

    public PieceArchetype archetype() 
    { 
     return this.pieceArchetype; 
    } 

    public Color color() 
    { 
     return this.color; 
    } 

    @Override 
    public boolean isFriendlyTo(IPiece piece) 
    { 
     if(this.equals(piece)) 
      return true; 

     return this.isFriendlyTo((AbstractChessPiece) piece); 
    } 

    public boolean isFriendlyTo(AbstractChessPiece piece) 
    { 
     return this.color() == piece.color(); 
    } 

    @Override 
    public abstract Square[] destinationsFrom(IBasicBoard onBoard, Square fromSquare); 
} 

我的問題關於isFriendlyTo(IPiece)方法。將此方法包含在IPiece接口中是否是一種糟糕的設計,因爲它需要對任何派生類型進行強制轉換。沒有鑄造就無法計算結果。它看起來很尷尬。當涉及到投射時,我總是會猜測一個設計。

+1

爲什麼不在'IPiece'中包含一個訪問器'getColor'?然後沒有必要施放... – wakjah

+0

@wakjah我想到了這一點,但我正在探索重新使用界面來構建其他非棋類遊戲的可能性,其中片友好不是由顏色決定的。 – TheSecretSquad

+1

你能否擁有一個「IPiece」而不是「AbstractChessPiece」的對象?如果這從來沒有發生過,那麼我認爲你不需要'IPiece'。 –

回答

3

如果你真的想保留這個接口結構,你可以添加一個泛型類型到接口。它定義了它可能敵對的部分。這是Comparable接口做什麼,其作用如下:

public interface IPiece<E> { 
    boolean isFriendlyTo(E piece); 
    ... 
} 
public abstract class AbstractChessPiece implements IPiece<AbstractChessPiece> { 
    ... 
    @Override 
    public boolean isFriendlyTo(AbstractChessPiece piece) { 
    return this.color() == piece.color(); 
    } 
    ... 
} 

我會然而,隨着wakjah去,並建議接口聲明的getColor或者一個getPlayer方法。

在兩種不同的情況下,如果它們以某種方式相互作用(例如,棋子和棋子可能會突然一起玩),您應該只使用相同的界面。在你的情況下,似乎遊戲機制完全不相交,所以使用不同的接口是有意義的。

如果您使用相同的代碼爲兩個遊戲渲染圖形,則可以定義另一個不包含遊戲播放方法的界面,如isFriendlyTo。這將分離共享圖形功能,形成不相連的遊戲播放功能。