我目前正在尝试用java编写游戏引擎/库,并在创建事件系统时遇到问题。我希望有一个全局EventManager类来管理每次更新一次的事件队列。用户不应更改此类,但应该能够使用用户创建的事件侦听器和事件。所以我有一个抽象类Event,用户可以从中创建子类作为自己的事件类型。用户创建的侦听器应该都是EventListener接口的子接口,以便用户可以将几个自己的侦听器实现到类中。 由于每个侦听器都具有应触发其action方法的特定eventType,因此必须有一个变量或方法可以告诉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);
}
}
abstract Event superclass:
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----
}
}
提前致谢!
答案 0 :(得分:0)
接口只是契约,它们确保类将定义接口中给出的方法。接口的主要目的是,如果你知道一个类实现了一个接口,那么你也知道你会在类中找到接口的方法。
更具可读性,并支持命名约定。
尝试使用抽象类来代替。
答案 1 :(得分:0)
当接口扩展另一个接口时,就像在类中一样,它继承了它的所有方法。
我理解你的问题,我之前已经有了。 您不允许在接口上进行任何实现。你可以选择将它变成一个抽象类,但是你可能需要扩展多个类,你不能。 您可能想要做的是保留抽象类(实现该接口)的引用,而只是使用该引用来处理与事件相关的事物。 你也可以通过匿名方式来保存自己:
EventListener evListener = new EventListener(){
void trigger(Event e){
//do whatever with event e
}
ArrayList<Event> getEventTypes(){
//return event type
}
};
希望它有所帮助:)
答案 2 :(得分:0)