【发布时间】:2014-05-24 22:39:56
【问题描述】:
我目前正在尝试用 Java 编写游戏引擎/库,但在创建事件系统时遇到了问题。我希望有一个全局 EventManager 类来管理每次更新一次的事件队列。此类不应由用户更改,但它应该能够与用户创建的事件侦听器和事件一起使用。所以我有一个抽象类 Event ,用户可以从中创建子类作为他自己的事件类型。用户创建的监听器都应该是EventListener接口的子接口,这样用户就可以在一个类中实现自己的几个监听器。 由于每个监听器都有特定的 eventTypes 应该触发他的操作方法,所以必须有一个变量或方法可以告诉 EventManager 哪些事件对这个监听器感兴趣。
有没有办法让子接口能够覆盖超接口的方法? 或者对于将侦听器与事件匹配的问题,还有其他好的解决方案吗?
以下是我到目前为止制作的类和接口的部分内容:
EventManager 类:
import java.util.ArrayList;
public class EventManager {
private static ArrayList<Event> eventQueue = new ArrayList<Event>();
private static ArrayList<EventListener> listeners = new ArrayList<EventListener>();
public static void queueEvent(Event e){
eventQueue.add(e);
}
public static void instantEvent(Event e){
for(int i = 0; i < eventQueue.size(); i++){
for(int l = 0; l < listeners.size(); l ++){
if(listeners.get(l).getEventTypes().contains(e))listeners.get(l).trigger(e);
}
}
}
public static void processEventQueue(){
for(int i = 0; i < eventQueue.size(); i++){
for(int l = 0; l < listeners.size(); l ++){
if(listeners.get(l).getEventTypes().contains(eventQueue.get(i)))listeners.get(l).trigger(eventQueue.get(i));
}
}
eventQueue.clear();
}
public static void addListener(Object o){
if(o instanceof EventListener)listeners.add((EventListener) o);
}
public static void removeListener(Object o){
if(o instanceof EventListener)listeners.remove((EventListener) o);
}
}
抽象事件超类:
public abstract class Event {
//Just empty, maybe I´ll put in something later...
}
EventListener 超接口:
import java.util.ArrayList;
public abstract interface EventListener{
public abstract void trigger(Event e);
public abstract ArrayList<Event> getEventTypes();
}
监听子接口:
public interface ExampleListener extends EventListener{
@Override
public ArrayList<Event> getEventTypes(){
//This method isn´t allowed to have a body.
//----THAT IS THE PROBLEM----
}
}
提前致谢!
【问题讨论】:
-
接口中的方法是按定义抽象的。如果你想在这样的层次结构中实现一个方法,也许可以考虑抽象类?