2017-11-25 5 views
1

私はオブジェクトGameLogicPlayer(インターフェイス)オブジェクトを持っています。カプセル化を破ることなく別のオブジェクトのメソッドを呼び出す

GameLogicは、GameLogicの中で使用されて、利用可能な移動について知っている方法getAvailableMoves()を持っています。

私は現在、戦略としてMinimaxアルゴリズムを使用するAIPlayer(実装はPlayer)を実装しています。そのためにはAIPlayerGameLogicgetAvailableMoves()メソッドを使用できるようにしたいと考えています。しかし、私はカプセル化を破ることなくそれをしたいと思います。つまり、Playerへの参照としてGameLogicを渡すのを避けようとしています。

このシナリオにはどのような解決策がありますか?私はデザインパターンを使用すべきだと思っていますが、どちらが確実かはわかりません。

+0

あなたは、サービスクラスが必要になります。 – SynchroDynamic

答えて

0

オブジェクトにメッセージを送信できるようにするには、通常、オブジェクトにその知識が必要です(イベントとして実装する必要がある場合を除きます)。 AIPlayerクラスとGameLogicとの緊密な結合を心配している場合は、そのメソッドのためだけにInterfaceを作成し、GameLogicに実装させてからAIPlayerに渡すことができます。そうすれば、AIPlayerの唯一の依存関係は、特定のGameLogicの実装ではなく、インターフェースに依存します。

0

方法1:プレイヤーの内側が、外側からgetAvailableMovesを呼び出すために、あなたがgetAvailableMovesのパラメータとしてプレイヤーを渡すことができ

必要がありません:

class GameWorld { 

     main(){ 

     GameLogic gl = new GameLogic(); 
     AIPlayer player = new AIPlayer(); 
     player.move(gl.getAvailableMoves(player)); 

    } 
} 

GameLogicクラス

class GameLogic { 

     public object getAvailableMoves(Player player){ 
      player.getX(); 
      player.getY(); 

      return availableMoves; 
     } 
     } 

プレーヤークラス

 class Player{ 
      float x; 
      float y; 

     } 

AIPlayerクラス

 class AIPlayer extends Player { 
      void move(){ 

      } 

     } 

方法2:

また別の方法は、getAvailableMovesが静的にし、内部のプレーヤーのクラスからそれを呼び出すことです。

AIPlayerクラス

class AIPlayer extends Player { 
      void move(){ 
       GameLogic.getAvailableMoves(this); 
      } 

     } 

GameLogicクラス

class GameLogic { 

public static object getAvailableMoves(Player player){ 
     player.getX(); 
     player.getY(); 

     return availableMoves; 
    } 
    } 
関連する問題