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

时间:2009-11-01 23:04:21

标签: java

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

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

我该怎么办?

6 个答案:

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