我正在学习Java,我希望将我的课程变成一个可观察的课程。
但是我已经扩展了另一个班级。
我该怎么办?
答案 0 :(得分:41)
我建议完全避免使用Observable
类,而是定义特定于事件的侦听器和相应的事件定义。然后在类中定义一个监听器列表,以及添加和删除监听器的方法,并将事件传播给它们(见下文)。
Observable
强制您使用java.lang.Object
来表示事件,然后使用instanceof
检查事件类型,这是一种丑陋的非OO方法,并使代码更难理解。如果您查看javax.swing包中的类,您会看到他们完全避免使用Observer
/ Observable
并使用类似于下面的方法。
活动定义
public class MyChangeEvent extends EventObject {
// This event definition is stateless but you could always
// add other information here.
public MyChangeEvent(Object source) {
super(source);
}
}
听众定义
public interface MyChangeListener {
public void changeEventReceived(MyChangeEvent evt);
}
课程定义
public class MyClass {
// Use CopyOnWriteArrayList to avoid ConcurrentModificationExceptions if a
// listener attempts to remove itself during event notification.
private final CopyOnWriteArrayList<MyChangeListener> listeners;
public class MyClass() {
this.listeners = new CopyOnWriteArrayList<MyChangeListener>();
}
public void addMyChangeListener(MyChangeListener l) {
this.listeners.add(l);
}
public void removeMyChangeListener(MyChangeListener l) {
this.listeners.remove(l);
}
// Event firing method. Called internally by other class methods.
protected void fireChangeEvent() {
MyChangeEvent evt = new MyChangeEvent(this);
for (MyChangeListener l : listeners) {
l.changeEventReceived(evt);
}
}
}
答案 1 :(得分:1)
Java不允许多重继承,因此没有直接的方法。您应该考虑使用一个委托模式,让您的主对象将其观察者行为委托给另一个对象。
class YourObject extends ItsAncestorClass
{
private Observer includedObserver;
public Observer getHisObserver(..)
}
另一种方法是将您的类扩展到的对象转换为接口,然后您将被允许从Observer扩展。
答案 2 :(得分:1)
另一种选择是将对象包装在Observable对象中。
public class MyObjectObservableWrapper implements Observable {
private MyObject myObject;
public MyObjectObservaleWrapper(MyObject myObject){
this.myObject = myObject;
}
// interface methods here
}
当Observable方法使用的数据可通过MyObject的公共方法访问时,此选项有效。因此,它可能并不适合所有情况。
答案 3 :(得分:0)
Java中不可能进行多重继承(扩展两个类)。几乎在所有情况下都被认为是糟糕的设计。
如果您向我们提供更多信息,也许有人可以帮助您一点。
答案 4 :(得分:0)
您可以扩展Observable并将原始父级包装在您的可观察子类中。将所有方法调用委托给包装对象。
答案 5 :(得分:-6)
使用桥梁。
创建一个扩展Observable的类,第一个类只调用第二个类的方法。
Bridge方法细节:
public class XXX {
public class XXXObservableBridge : Observable {
public void RaiseEvent();
// Listeners etc
}
private XXXObservableBridge ObservableBridge;
XXX() {
ObservableBridge = new ObservableBridge;
}
public Observable AsObservable() { return ObservableBidge; }
public void RaiseEvent() { ObservableBridge.RaiseEvent(); }
}