Подтвердить что ты не робот

Как сделать расширение класса наблюдаемым, если оно расширило еще один класс?

Я изучаю Java, и я хочу сделать свой класс в наблюдаемом классе.

Однако у меня уже есть расширение другого класса.

Что мне делать?

4b9b3361

Ответ 1

Я бы рекомендовал избегать использования класса 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);
    }
  }
}

Ответ 2

Java не разрешает множественное наследование, поэтому нет прямого способа сделать это. Вам следует рассмотреть возможность использования шаблона делегирования, имеющего ваш основной объект, который делегирует поведение наблюдателя другому объекту.

class YourObject extends ItsAncestorClass
{
      private Observer includedObserver;

      public Observer getHisObserver(..)
}

Другой подход - это превратить объект, из которого распространяется ваш класс, в интерфейс, тогда вам будет разрешено продлеваться с Observer.

Ответ 3

Другой вариант - обернуть ваш объект в объект Observable.

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

Эта опция работает, когда данные, которые будут использоваться методами Observable, доступны через общедоступные методы MyObject. Таким образом, он может быть непригоден для всех случаев.

Ответ 4

Множественное наследование (для расширения двух классов) невозможно в Java. В большинстве случаев считается плохим дизайном.

Если вы дадите нам дополнительную информацию, возможно, кто-то может помочь вам немного больше.

Ответ 5

Вы можете расширить Observable и обернуть исходный родитель в свой наблюдаемый дочерний класс. Делегировать все вызовы методов на обернутый объект.

Ответ 6

Используйте мост.

Создайте класс, который расширяет 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(); }
 }