【问题标题】:java - subinterface overriding superinterfaces methodjava - 子接口覆盖超接口方法
【发布时间】: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----
}

}

提前致谢!

【问题讨论】:

  • 接口中的方法是按定义抽象的。如果你想在这样的层次结构中实现一个方法,也许可以考虑抽象类?

标签: java interface


【解决方案1】:

当一个接口扩展另一个接口时,比如在一个类中,它会继承它的所有方法。

我了解您的问题,我以前也遇到过。 您不允许在接口上进行任何实现。你可以选择把它变成一个抽象类,但是你可能需要扩展多个类,这是你不能的。 您可能想要做的是保留抽象类(实现该接口)的引用,并将该引用用于与事件相关的事物。 你也可以通过匿名方式来拯救自己:

EventListener evListener = new EventListener(){
  void trigger(Event e){
    //do whatever with event e
  }

  ArrayList<Event> getEventTypes(){
    //return event type
  }
};

希望它有所帮助:)

【讨论】:

  • 感谢代码块中的解决方案,我会尝试这样做:)。但是您描述了两种解决方案,而我不理解另一种解决方案。你能给我举个例子吗?
  • 好的。代码块上的解决方案意味着您正在初始化一个 EventListener 类型的对象并在运行时定义它。另一个实际上具有相同效果的解决方案是: public class ExampleEvent implements EventListener{ public void trigger(Event e){ //... trigger implementation } public ArrayList getEventTypes(){ //.... getEventTypes implementation } } 这个类现在可以拥有你的接口本身不能拥有的所有实现!现在您可以参考 ExampleEvent (已实现)!明白了吗?
【解决方案2】:

接口就像契约一样,它们确保类将定义接口中给出的方法。接口的主要目的是,如果你知道一个类实现了一个接口,那么你也知道你会在类中找到接口的方法。

更具可读性,并支持命名约定。

尝试为此使用抽象类。

【讨论】:

  • 问题是一个类只能从一个超类继承,但可以从多个接口继承……对吧?我希望有可能拥有多个侦听器或一个超类加上一个侦听器。
  • 是的,但不要试图交换超类和接口。接口只是一组方法,必须在实现接口的类中定义。我不太明白你的确切问题,你能否给我更准确的信息,关于你打算如何制作类树,你想达到什么目标?
【解决方案3】:

【讨论】:

    猜你喜欢
    • 2014-07-17
    • 1970-01-01
    • 2016-08-12
    • 2021-08-12
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    相关资源
    最近更新 更多