gpt4 book ai didi

java - 使用枚举封装事件处理

转载 作者:搜寻专家 更新时间:2023-11-01 00:57:09 24 4
gpt4 key购买 nike

我的应用层/ View 有一个事件调度系统,也就是黑板。在其中,监听器由 HashMap 存储,键是作为枚举 EventType 实现的事件类型,值是监听此事件类型的监听器引用。例如。模型对象正在监听事件类型“LOCAL_PLAYER_INPUT”,黑板处理并通知玩家,因为玩家实现了 EventHandler 接口(interface)。

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

MODEL.LOCAL.PLAYER_INPUT

只有像这样传递 MODEL,模型才会在 View 黑板中注册为监听器:

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

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

我该怎么办?

编辑:更多代码

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();

}

最佳答案

MODEL.LOCAL.PLAYER_INPUT 不是 EventType 类型,尽管 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 声明为枚举常量才能以这种方式访问​​它。遗憾的是,如果两者应具有相同的名称,则无法执行此操作。

如果我没有漏掉某些东西,您就必须找到一个完全不同的解决方案。可能不是您正在寻找的答案,但太长而无法发表评论。

关于java - 使用枚举封装事件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17147457/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com