0

プレイヤーが着地したマスを購入できるボードゲームがあるとします。Squares の抽象基本クラスに、次のメソッドがあります。

public abstract void applyLandOnAffect(Player player);

次に、BuyableSquares のクラスで、以下に示すこのメソッドを実装します。

@Override
 public void applyLandOnAffect(Player player){
    //Offer them the chance buy the square here.
}

次に、正方形を購入することを選択した場合、オブジェクトを BuyableSquares() から BoughtSquare() に変更します。BoughtSquare のコードは、別のプレイヤーが購入した正方形に着地したときに何が起こるかを処理します。しかし問題は、それをどこでどのように変換するかです。

私はこのタイプのコードを考えていました:

this = new BoughtSquare();

しかし、それは受け入れられない構文です。

どうすればこれにアプローチできますか?

ありがとう

4

6 に答える 6

2

ポリモーフィズムを使用して Square インスタンスのタイプに応じて異なる処理を行う場合、State design patternを使用することをお勧めします。

アプリケーションに導入するには、次のことを行う必要があります。

  • SquareState正方形のタイプに応じて異なるメソッドを使用して、eg という名前の新しいインターフェイスを定義します

    public interface SquareState {
        void applyLandOnAffect(Player player);
    }
    
  • SquareStateこのインターフェースを実装し、インターフェースからのメソッドの実装を提供するすべての正方形タイプを定義します

    public AvailableState implements SquareState {
        public void applyLandOnAffect(Player player) { // ..
        }
    }
    
    public BoughtState implements SquareState {
        public void applyLandOnAffect(Player player) { // ..
        }
    }
    
  • Square正方形の現在の状態を格納する新しい属性をクラス内に導入します

    public class Square {
        private SquareState state;
        // ..
    }
    

それが完了したら、Square の状態を変更するには、次のように呼び出します。

this.state = new BoughtSquare();
于 2013-05-21T23:35:10.300 に答える
0

Square購入済みの正方形と未購入の正方形に別々のクラスを用意するのではなく、1 つのクラスだけを呼び出す必要があります。Squareまたは、購入できない他のタイプの正方形を計画している場合は、拡張できます。purchasedデフォルトで設定されていると呼ばれるクラスにブール値を作成falseします。次に、正方形を購入すると、値を に設定できますtrue

public class PurchaseableSquare extends Square
{
    private boolean purchased;

    public Square()
    {
        this.purchased = false;
    }

    public void purchaseSquare()
    {
        this.purchased = true;
    }
}
于 2013-05-21T23:37:34.630 に答える
0

まず、 には何も代入できませんthis

あなたが望むものを達成するためにBuyableSquares、正方形が購入されたかどうかを示すフラグをクラスに作成してみませんか。

 public class BuyableSquares extends Squares {

     private boolean bought = false; // by default

     //...

     public void markAsBought() {
          bought = true;
     }
 }
于 2013-05-21T23:37:47.647 に答える