PropertyChangeListener Vererbung

ArnoldS

Mitglied
Hallo,
ich habe ein Problem mit Listener und Vererbung. Ich habe eine abstrakte Klasse mit Eigenschaften und PropertyChangeSupport. hier ein Ausschnitt
Java:
public abstract class Resource {
 private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
...
 public void setHours(float hours) {
        float oldHours = this.hours;
        this.hours = hours;
        propertyChangeSupport.firePropertyChange("hours", oldHours, hours);
    }
}
Ich habe nun eine weiter Klasse, die von dieser erbt
Java:
public class WorkWorker extends Resource implements Serializable {
       private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
....
 public void setCostHour(float costHour) {
        float oldCostHour = this.costHour;
        this.costHour = costHour;
        propertyChangeSupport.firePropertyChange("costHour", oldCostHour, costHour);
        }
/**
     * Add PropertyChangeListener.
     *
     * @param listener
     */
    public void addPropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.addPropertyChangeListener(listener);
            
    }

    /**
     * Remove PropertyChangeListener.
     *
     * @param listener
     */
    public void removePropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.removePropertyChangeListener(listener);
    }
Leider wird nun scheinbar die firePropertyChange der abstrakten Klasse nicht aufgerufen, sondern nur jene von der abgeleiteten Klasse. Wenn ich die Methode addPropertyChange nur in der Basisklasse einfüge, dann ist es halt genau umgekehrt. Falls ich sie bei beiden einfüge dann ist es das gleiche, als wenn ich sie nur in der abgeleiteten Klasse einfüge.
Wie kann ich es bewerkstelligen, dass ich in der WorkWorkerKlasse die firePropertyChange Ereignisse der Basisklasse verwalten kann.

danke
Arnold
PS: ich bin neu in Java und deshalb ist mir dies mit PropertChange noch nicht ganz klar
 
Habe nun in der abstrakten Klasse den Listener hinzugefügt:
Java:
...
 public void addPropertyChangeListenerSuper(PropertyChangeListener listener) {
        propertyChangeSupport.addPropertyChangeListener(listener);

    }

 public void removePropertyChangeListenerSuper(PropertyChangeListener listener) {
        propertyChangeSupport.removePropertyChangeListener(listener);
    }
in der abgeleiteten Klasse, rufe ich einfach die Methode der superklasse auf:
Java:
 public void addPropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.addPropertyChangeListener(listener);
       // calling the also the listener of the superclass
        super.addPropertyChangeListenerSuper(listener);
    }

    
    public void removePropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.removePropertyChangeListener(listener);
        // calling the also the listener of the superclass
         super.removePropertyChangeListenerSuper(listener);
    }
Zwar funktioniert es nun, aber ob dieser Lösungansatz der richtige ist? Scheint mir leider nicht so. Gibt es nicht eine ellegantere Lösung?
Ich meine:
nur in der abgeleiteten Klasse den Listener implementieren und auch bei Änderungen von Eigenschaften in der abstrakten Klasse ein firePropertyChange auslösen ?

danke
 
Würde nicht sowas gehen?

Java:
public class Base {
    protected PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);

    public void addPropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.addPropertyChangeListener(listener);
    }

    public void removePropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.removePropertyChangeListener(listener);
    }
}

public class Derived extends Base {
    public void setData(String data) {
        String oldData = this.data;
        this.data = data;
        propertyChangeSupport.firePropertyChange("data", oldData, data);
    }
}
 
Du solltest die PropertyChangeSupport instanz in deiner Basisklasse auf 'protected' setzten und aus der Subklassen loeschen.
Ansonsten hast du 2 verschiedene Instanzen mit demselben namen!
 
ok, danke für die Hilfe, werde es so testen, so sollte es dann auch funktionieren!
Ich habe halt immer gedacht man sollte mit protected oder auch publich sehr vorsichtig umgehen. Ich wollte die Sichtbarkeit der Variablen nicht erweitern. Wenn das aber so usus ist, dann bin ich schon erleichtert und nochmals Danke, endlich komme ich weiter!
 

Zurück
Oben