gpt4 book ai didi

java - 将父级作为子级引用作为参数传递给接受子级作为 Java 中参数的函数

转载 作者:行者123 更新时间:2023-11-30 03:24:53 24 4
gpt4 key购买 nike

也许标题不正确,所以我会更准确地解释我需要做什么。我重写了一个“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()};

并且 RewritingObservable 通知它调用观察者的更新。

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

我正在使用 RewritingObservable 类的扩展

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

问题是 ObservableChild 类无法调用 super.notify(event),因为 return returnMeAnEvent() 函数是一个抽象类型(虽然我实际上返回一个子引用),所以它实际上搜索

public void notify(Event event){
}

我在理解继承方面有问题吗?您有什么建议我可以解决这个问题?我不知道是使用 ObservableChild 类中的 @Overridenotify 方法还是使用 super.notify() 更好 方法并尝试使其工作。

最佳答案

您可能想要按如下方式更改RewritingObservable:

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

请注意,这可能不适用于 RewritingObserver 的当前结构,因为重载可能不明确。无论如何,您可能需要一个通用接口(interface),而不是在正确的实现中专门化事件处理。

这也极大地简化了RewritingObserver的实现

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您可能会对它的答案感兴趣。

关于java - 将父级作为子级引用作为参数传递给接受子级作为 Java 中参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30481571/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com