5

我的应用层/视图有一个事件调度系统,也就是黑板。在其中,侦听器由哈希图存储,其中键是事件类型,实现为枚举 EventType,值是侦听此事件类型的侦听器引用。例如,模型对象正在侦听事件类型“LOCAL_PLAYER_INPUT”,黑板处理并通知播放器,因为播放器实现了 EventHandler 接口。

我想通过为模型实现一个独立的黑板来进一步解耦我的模型。然后它将作为侦听器添加到应用层黑板,因为应用层正在从键盘或触摸获取 I/O。模型黑板本身将进一步委托事件。为此,我想创建一个枚举层次结构,其中事件以这种方式分类:

MODEL.LOCAL.PLAYER_INPUT

只有通过像这样传递 MODEL 才能在视图黑板上将模型注册为侦听器:

addListener(model.blackboard, MODEL); //Types: (EventHandler, EventType)

通过将接口与我实现的枚举相结合,我可以编写像 MODEL.XY 这样的事件类型,但它不会被 addListener 接受,尽管 MODEL 正在实现 EventType 接口。

我应该怎么办?

编辑:更多代码

addListener 方法:

    public void addListener(EventHandler handler, EventType eventType) {
    getListener(eventType).add(handler);}


private Array<EventHandler> getListener(EventType eventType) {
    if(map.containsKey(eventType))
        return map.get(eventType);
    else {
        Array<EventHandler> tmp = new Array<EventHandler>(false, 1, EventHandler.class);
        map.put(eventType, tmp);
        return tmp;
    }

}

枚举:

public interface WL extends EventType {

public static enum LOCAL {
    PLAYER_INPUT,
    NPC_INPUT
}

}

游戏事件:

    public GameEvent(EventType eventType, Object message) {
    this.eventType = eventType;
    this.message = message;
    timeStamp = System.currentTimeMillis();

}
4

1 回答 1

0

MODEL.LOCAL.PLAYER_INPUTEventType即使是,也不是类型MODEL。由于枚举是 的内部类MODEL,因此它的类型实际上是LOCAL

public interface WL extends EventType { // Your interface WL is EventType

    public static enum LOCAL { // Your enum is type LOCAL because there are no extensions
        PLAYER_INPUT,
        NPC_INPUT // Your enum constants represents something of type LOCAL
    }
}

您可以将其更改为:

public enum WL implements EventType { // Your interface WL is EventType

    public static enum LOCAL implements EventType { // LOCAL is now EventType
        PLAYER_INPUT,
        NPC_INPUT // So are the enum constants
    }
}

问题是,如果您现在提到WL.LOCAL,它的类型将是Class(不是 100% 确定那个,但它肯定不是EventType。甚至可能无法编译)。您必须声明LOCAL为枚举常量才能以这种方式访问​​它。遗憾的是,如果两者都应具有相同的名称,则无法做到这一点。

如果我没有遗漏任何东西,您将不得不找到一个完全不同的解决方案。可能不是您正在寻找的答案,但太长而无法发表评论。

于 2013-06-17T14:45:27.203 回答