将实例视为超类时,将忽略重载方法
我正在设计一个使用两个抽象类GameEvent
和DynamicGameMechanic
的游戏引擎。 DynamicGameMechanic
具有方法handleEvent(GameEvent)
,该方法默认情况下会引发错误警告,说明该机械师未配置为处理该事件。然后,将特定的游戏机制设计为使handleEvent()
的特定实例重载GameEvent
方法。
因此,城市游戏机械师可以处理例如CityCreateEvent
。问题是,这不起作用,并且GameEvents
使用的是无法重载的方法,该方法会生成无法识别的游戏事件错误。我究竟做错了什么?我怀疑这与以下事实有关(在下面的代码中),特定的DynamicGameMechanic
类实例已被上载到DynamicGameMechanic
。
任何人都可以解释一下并提出解决方法吗?我有几个解决方法,但是它们不是很漂亮。
//Found in the GameInitEvent class
public JsonObject publish() {
JsonBuilder builder = new JsonBuilder();
boolean allPassed = true;
for (DynamicGameMechanic<?> dyn : getTargets()) {
JsonObject result = dyn.handleEvent(this);
if (allPassed && result.get("result").getAsString().equals(SUCCESS)) allPassed = false;
builder.add(dyn.name(), result);
}
builder.add("result", allPassed);
return builder.build();
}
//Found in the History GameMechanic
public JsonObject handleEvent(GameEvent event) {
//TODO revisit this after fleshing out the history class
System.out.println("Foo");
return GameEvent.success();
}
public JsonObject handleEvent(GameInitEvent event) {
//TODO revisit this after fleshing out the history class
System.out.println("Bar");
return GameEvent.success();
}
在上面的代码中,打印"Foo"
而不是"Bar"
。实际上,这会产生UnsupportedOperationException()
。