我的应用层/视图有一个事件调度系统,即黑板。在其中,侦听器由散列映射存储,其中键是作为枚举EventType实现的事件类型,而值是侦听此事件类型的侦听器引用。例如。模型对象正在侦听事件类型“LOCAL_PLAYER_INPUT”,黑板进程并通知玩家,因为玩家实现了EventHandler接口。
我想通过实施模型的独立黑板来进一步解耦我的模型。然后它将被添加为应用程序层黑板的监听器,因为应用程序层从键盘或触摸获得I / O.模型黑板本身会进一步委托事件。 为此我想创建一个枚举层次结构,其中事件按这种方式分类:
MODEL.LOCAL.PLAYER_INPUT
只有通过这样的模型,模型才能在视图黑板中注册为监听器:
addListener(model.blackboard, MODEL); //Types: (EventHandler, EventType)
通过将接口与我实现的枚举相结合,我可以编写类似MODEL.X.Y的事件类型,但是尽管MODEL正在实现EventType接口,但addListener不会接受它。
我该怎么办?
编辑:更多代码
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
}
}
GameEvent:
public GameEvent(EventType eventType, Object message) {
this.eventType = eventType;
this.message = message;
timeStamp = System.currentTimeMillis();
}
答案 0 :(得分:0)
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
,它的类型将是EventType
(不是100%确定那个,但它不是LOCAL
。甚至可能无法实际编译)。您必须将{{1}}声明为枚举常量才能以这种方式访问它。遗憾的是,如果两者都具有相同的名称,则无法做到这一点。
如果我没有遗漏某些东西,你必须找到完全不同的解决方案。可能不是你想要的答案,但是太长了,无法发表评论。