当扩展另一个类时,如何使类扩展Observable?

我正在学习Java,我希望将我的课程变成一个可观察的课程。

但是我已经扩展了另一个类。

我该怎么办?

我建议完全避免使用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 listeners; public class MyClass() { this.listeners = new CopyOnWriteArrayList(); } 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); } } } 

Java不允许多重inheritance,因此没有直接的方法来实现它。 您应该考虑使用具有主要对象的委托模式,该委托模式将其观察者行为委托给另一个对象。

 class YourObject extends ItsAncestorClass { private Observer includedObserver; public Observer getHisObserver(..) } 

另一种方法是将您的类扩展的对象转换为接口,然后您将被允许从Observer扩展。

另一种选择是将对象包装在Observable对象中。

 public class MyObjectObservableWrapper implements Observable { private MyObject myObject; public MyObjectObservaleWrapper(MyObject myObject){ this.myObject = myObject; } // interface methods here } 

当Observable方法使用的数据可通过MyObject的公共方法访问时,此选项有效。 因此,它可能不适合所有情况。

Java中不可能进行多重inheritance(扩展两个类)。 几乎在所有情况下都被认为是糟糕的设计。

如果您向我们提供更多信息,也许有人可以帮助您。

您可以扩展Observable并将原始父级包装在您的可观察子类中。 将所有方法调用委托给包装对象。

使用桥梁。

创建一个扩展Observable的类,第一个类只调用第二个类的方法。

桥梁方法细节:

  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(); } }