助けてくれてありがとう。結局のところ、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 が正しく表示されました。