0

私は最近 C++ でゲームに取り組んでおり、コマンド パターンを実装してキーボード入力を管理し、宇宙船を制御していました。すべてのコマンドをインスタンス化するとき、宇宙船ポインターを各コンストラクターに渡して、すべてのコマンドが同じ宇宙船オブジェクトで動作するようにしました。

C++ では参照渡しができるため、このパターンは理にかなっていますが、Java ではすべてが値渡しです。Java で同じことを実装しようとすると、各コマンドが同じオブジェクトを指すようにするにはどうすればよいでしょうか?

私が見た Java で使用される Command パターンのすべての例では、各 Command のメンバー変数がコピーであるか参照であるかに違いはありません。

4

4 に答える 4

1

助けてくれてありがとう。結局のところ、Java がどのように機能するかについての私の完全な誤解に帰着しました。Commandを作成してオブジェクトに渡すと、元のオブジェクトへの参照ではなくコピーを受け取るという印象を受けました (何らかの奇妙な理由で) 。その場合.execute()、 aCommandを呼び出しても、クラス外のオブジェクトには何の影響もありません。

しかし、小さなテストを作成した後、これは当てはまらないことがわかりました。

スプライト.java:

public class Sprite {
    private int x;

    Sprite(int x) {
        this.x = x;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }
}

Command.java:

public interface Command {
    void execute();
}

MoveLeftCommand.java:

public class MoveLeftCommand implements Command {
    private Sprite s;

    MoveLeftCommand(Sprite s) {
        this.s = s;
    }

    public void execute() {
        s.setX(s.getX() - 1);
    }
}

MoveRightCommand.java:

public class MoveRightCommand implements Command {
    private Sprite s;

    MoveRightCommand(Sprite s) {
        this.s = s;
    }

    public void execute() {
        s.setX(s.getX() + 1);
    }
}

テスト.java:

import java.lang.*;
import java.util.*;

public class Test
{    
    public static void main(String[] args) {
        Sprite mario = new Sprite(0);
        Command command = null;

        Map<String, Command> commands = new HashMap<String, Command>();
        commands.put("a", new MoveLeftCommand(mario));
        commands.put("d", new MoveRightCommand(mario));

        // Test...
        System.out.println(mario.getX()); // 0

        command = (Command) commands.get("a");

        command.execute();
        System.out.println(mario.getX()); // -1
        command.execute();
        System.out.println(mario.getX()); // -2

        command = (Command) commands.get("d");

        command.execute();
        System.out.println(mario.getX()); // -1
    }
}

C++ の場合と同じように、コンソールに 0 -1 -2 -1 が正しく表示されました。

于 2012-02-18T02:30:31.053 に答える
0

Javaでは、「値渡し」で渡されました...実行メソッドを実装する実際のオブジェクトを渡します。異なるオブジェクト間での参照の共有は、適切な OO 設計または共通属性のルックアップ メソッド注入によって実現できます。コマンド パターンの例は、wikipediaから取得しました。

/*the Command interface*/
public interface Command {
   void execute();
}


/*the Invoker class*/
import java.util.List;
import java.util.ArrayList;

public class Switch {

   private List<Command> history = new ArrayList<Command>();

   public Switch() {
    }

   public void storeAndExecute(Command cmd) {
      this.history.add(cmd); // optional 
      cmd.execute();        
   }

}


/*the Receiver class*/
public class Light {

   public Light() {
   }

   public void turnOn() {
      System.out.println("The light is on");
   }

   public void turnOff() {
      System.out.println("The light is off");
   }

}


/*the Command for turning on the light - ConcreteCommand #1*/
public class FlipUpCommand implements Command {

   private Light theLight;

   public FlipUpCommand(Light light) {
      this.theLight = light;
   }

   public void execute(){
      theLight.turnOn();
   }

}


 }
于 2012-02-15T11:04:04.583 に答える