将父作为子引用作为参数传递给在Java中接受子项作为参数的函数

时间:2015-05-27 11:48:07

标签: java inheritance overloading

也许标题是不正确的,所以我会更准确地解释我需要做什么。 我已经重写了一个" Observer-Observable" interface让我的Observer根据我提出的各种通知update(Observable o, Object arg)对方法Events进行重载写道(我没有使用java.awt中的那些)。 例如

public interface RewrittenObserver{
    public void update(RewrittenObservable o, EventChild1 event);
    public void update(RewrittenObservable o, EventChild2 event);
    public void update(RewrittenObservable o, EventChild3 event);
    .....
}

我程序中的每个函数都返回一个EventChild(将Event作为抽象类父)。

public Event returnMeAnEvent(){... return new EventChild1()};

并且RewrittenObservable通知它调用Observer的更新。

public abstract class RewrittenObservable {
     private RewrittenObserver observer;
     /*....Constructor definitions...*/
     public void notify(EventChild1 event){
         observer.update(this, event);
     }
}

我正在使用RewrittenObservable

的扩展名
public class ObservableChild extends RewrittenObservable{
    ....
    public void doSomething(){... notifyChild(returnMeAnEvent())};
    public void notifyChild(EventChild1 event){
      super.notify(event);
}

问题是ObservableChild课程无法调用super.notify(event),因为returnMeAnEvent()函数的返回是抽象类型(而我实际上正在返回一个子引用),所以实际上它会搜索

public void notify(Event event){
}

了解继承有问题吗?你有什么建议我解决这个问题?我不知道@Overridenotify方法中的ObservableChild方法或使用super.notify()方法是否更好,并尝试使其有效

1 个答案:

答案 0 :(得分:2)

您可能希望更改RewrittenObservable,如下所示:

public abstract class RewrittenObservable {
     // ...
     public void <T extends Event> notify(T event) {
         observer.update(this, event);
     }
}

请注意,这可能不适用于RewrittenObserver的当前结构,因为重载可能不明确。您可能还需要通用接口,而是在正确的实现中专门处理事件处理。

这也极大地简化了RewrittenObserver

的实施
public interface RewrittenObserver<T extends Event> {
     public void update(RewrittenObservable o, T event);
}

然后使用以下特定子类:

public class EventChild1Observer implements RewrittenObserver<EventChild1> {
    @Override
    public void update(RewrittenObservable o, EventChild1 event) {
        // implementation here
    }
}

在旁注上:this codereview-question并且你可能对它的答案很感兴趣。