Java - 创建方法数组

Jas*_*ker 16 java arrays methods

我正在为学校的进步设计一个基于文本的冒险游戏.我将每个"级别"设置为一个类,并将每个可探测区域(节点)设置为相应类中的方法.

让我烦恼的是从一个节点移动到另一个节点的代码.因为每个节点最多连接四个其他节点,所以我必须在每个方法中重复一个非常相似的代码块.

我更喜欢做的是在每个节点的开头包含一系列方法,如下所示:

public static void zero()
{
    ... adjacentNodes[] = {one(), two(), three(), four()};
}
Run Code Online (Sandbox Code Playgroud)

然后将该数组发送到通用方法,并让它将播放器发送到正确的节点:

public static void move(...[] adjacentNodes, int index)
{
    adjacentNodes[index];
}
Run Code Online (Sandbox Code Playgroud)

我简化了我的代码,但这是一般的想法.这可能吗?

gpe*_*che 55

无论何时考虑指向函数的指针,都可以使用适配器模式(或变体)转换为Java.它会是这样的:

public class Node {
    ...
    public void goNorth() { ... }
    public void goSouth() { ... }
    public void goEast() { ... }
    public void goWest() { ... }

    interface MoveAction {
        void move();
    }

    private MoveAction[] moveActions = new MoveAction[] {
        new MoveAction() { public void move() { goNorth(); } },
        new MoveAction() { public void move() { goSouth(); } },
        new MoveAction() { public void move() { goEast(); } },
        new MoveAction() { public void move() { goWest(); } },
    };

    public void move(int index) {
        moveActions[index].move();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,此示例为每个"Node"实例创建4个"MoveActions".通过重新思考这个实现,你可以使`MoveAction`对象可以为所有实例共享.在这种情况下,它将涉及将`move()`更改为`move(Node)`,将4`MoveAction`实现为静态类,并在调用`move()`时传递`this`. (2认同)
  • 感谢您提供整个编码示例。 (2认同)

Fre*_*chi 6

只需让你的节点成为所有符合相同界面的对象,然后你就可以可靠地调用它们的方法.


Mic*_*rdt 5

由于Java没有将方法作为一等实体的概念,因此只有通过反射才能实现,这很痛苦且容易出错。

最好的近似值可能是将方法的每个实例实现的枚举级别设为:

public enum Level1 implements Explorable{
    ROOM1 {
        public void explore() {
            // fight monster
        }
    }, ROOM2 {
        public void explore() {
            // solve riddle
        }
    }, ROOM3 {
        public void explore() {
            // rescue maiden
        }
    };

}

public interface Explorable{
    public abstract void explore();    
}

public static void move(Explorable[] adjacentNodes, int index)
{
    adjacentNodes[index].explore();
}
Run Code Online (Sandbox Code Playgroud)

但是,这有点滥用枚举概念。我不会将它用于一个严肃的项目。