也许标题是不正确的,所以我会更准确地解释我需要做什么。
我已经重写了一个" 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){
}
了解继承有问题吗?你有什么建议我解决这个问题?我不知道@Override
类notify
方法中的ObservableChild
方法或使用super.notify()
方法是否更好,并尝试使其有效
答案 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并且你可能对它的答案很感兴趣。