Vererbung Multivererbung und Observable

Lord_Aratorn

Aktives Mitglied
Hallo, ich bin habe da so ein Problem, dass ich gerne möglichst elegant lösen würde.

Also, ich habe mir ein Interface mit Namen Observable geschrieben. Dieses soll von den Klassen implementiert werden, die observable (nach dem Observer-Pattern) sein sollen. Dies bedeutet, das das Interface die Methoden addObserver(), notifyObservers() und removeObservers() beinhalten muss.
Zudem wäre es ja nun auch schön, wenn ein Vektor in diesem Interface existiert, so dass alle implementierenden Klassen einen eigenen Vektor zu Verfügung stehen haben.
Da dieser Vektor später die Observer der Klasse beherbergen soll, wäre es günstig, wenn er nicht von außen veränderbar ist. Private variablen sind jedoch in Interfaces nicht gestattet und wenn der Vektor als final definiert wird, besitzen alle implementierenden Klassen den selben Vektor. Was wiederum zu dem Effekt führt, dass wenn die Klassen der Objekte A, B das Interface implementieren. Ein anderes Objekt C sich als Observer bei A registriert, dieses Objekt C auch Observer bei B wird. Dieser Effekt ist nicht gewünscht! Kommen wir zurück zur Problematik. Also ist es nicht möglich einen Vektor in der Interfaceklasse zu definieren. Und es muss ein Vektor der Observer beinhalten soll in jeder Klasse vorhanden sein, die das Observable implementiert. Nun, aktuell implementieren im meinem Code 23 Klassen dieses Interface. Daher ist selbst das anlegen eines Vektors redundanter Code, geschweige denn vom implementieren der jeweiligen Schnittstellen.

Eine weitere Möglichkeit ein Observable zu implementieren ist es das Observable nicht als Interfaceklasse sondern als Abstrakte Basisklasse zu gestalten. Doch hier gibt es das Problem mit der Multivererbung. In Java ist es nicht gestattet von mehreren Klassen zu erben. Daher kann z.b. Eine Klasse nicht gleichzeitig von Thread und von Observable erben, obwohl sowol die Fähigkeiten des Threads als auch die der Observableklasse benötigt werden.

Nun stellt sich mir die Frage, wie kann es realisiert werden, dass meine Wünsche befriedigt werden, und dennoch die Funktionalität vollständig vorhanden ist?

Vielen Dank
 

RySa

Bekanntes Mitglied
Wie wärs wenn du das Observable so wie du es wolltest als abstrakte Basisklasse definierst und einfach statt vom Thread zu erben, Runnable implementierst ?
 
S

SlaterB

Gast
> und wenn der Vektor als final definiert wird, besitzen alle implementierenden Klassen den selben Vektor.

nicht nur wenn final, sondern überhaupt,
ist quasi eine statische Variable, alle Klassen haben denselben Vector und auch alle Objekte einer Klasse, falls es nur eine gäbe,
ist wahrlich nicht geeignet, wobei das Attribut auch noch eher eine geringes Problem ist, nur eine Zeile,
die add-Methode ist auch noch klein, aber schon drei, mit Senden des Events wirds dann ultimativ aufwendig

eine allgemeine Lösung kann ich dir nicht nennen, so ist das eben mit Mehrfachvererbung,
Observable ist mir da als schlechtes Beispiel auch schon oft aufgefallen

(edit: bei Thread aktuell mag es eine Änderung geben, allgemein bleibt es ja beim Problem,
evtl. helfen recht breite Basisklassen mit Observable-Unterstützung, die in manchen erbenden Klassen gar nicht benötigt wird, aber gar nicht stört,
was spricht dagegen dass alle wichtigen Klassen von 'ThickObject' erben, mit Implementierung von Observable, Einführung einer Id, evtl. Serialisierung, Comparable usw.),

------

etwas Abhilfte schafft vielleicht ein Konstrukt mit einer externen Klasse die sich um alles kümmert,
ein Attribut ist dann nicht mehr nötig in den 23 Klassen,
jede der Methoden kann möglichst simpel delegiert werden:
Java:
add(Observer x) {
  Ober.add(this, x);
}

notifyObservers() {
  Ober.notifyObservers(this);
}
usw.
aber ob man nun diese 10 Zeilen ohne Attribut oder 15-20 Zeilen mit Attribut von Klasse zu Klasse kopiert?
viel hilft es nicht

die Klasse Ober braucht man dann natürlich auch mit statischen Methoden,
anhand des this-Objekts in Maps Listen verwalten
 
Zuletzt bearbeitet von einem Moderator:

Lord_Aratorn

Aktives Mitglied
@RySa
naja es liegt ja nicht am Thread, Thread have ich hier lediglich als Beispiel gewählt, da Thread oft genutzt wird.

@SlaterB
Ich sehe, wir verstehen uns. Es ist immer ein abwägen zwischen wenig Code, und guter Struktur.
 

Michael...

Top Contributor
Und es muss ein Vektor der Observer beinhalten soll in jeder Klasse vorhanden sein, die das Observable implementiert.
Du defnierst ja nur ein Interface, das Methodensignaturen oder statische Klassenvariablen vorschreibt. Die Verwaltung der Observer (ob in Array, Vector, List oder in einer Instanzvariable) müssen die implementierenden Klassen selbst definieren. (vorschreiben kann man das eh nicht)
Eine weitere Möglichkeit ein Observable zu implementieren ist es das Observable nicht als Interfaceklasse sondern als Abstrakte Basisklasse zu gestalten. Doch hier gibt es das Problem mit der Multivererbung. In Java ist es nicht gestattet von mehreren Klassen zu erben. Daher kann z.b. Eine Klasse nicht gleichzeitig von Thread und von Observable erben
Eine abstrakte Klasse wäre die Lösung um solche Sachen schon vorzuimplementieren. Du kannst ja ein Interface und eine abstrakte Klasse auf Basis diese Interfaces an bieten, um eventuell in ein paar der 23 Klassen die Implementierung der add und removeObserver() zu sparen.
Wenn's konkret um Threads geht: Üblicherweise erbt man nicht von Thread, sondern implementiert das Interface Runnable.
 

Ähnliche Java Themen

Neue Themen


Oben