# Vererbungsdeadlock!



## insomnio (22. Jun 2006)

Hi all!

in meiner App möchte ich einen grossen Teil generisch halten. Momentan habe ich ein Problem mit dem Model. Jeder Datensatz soll observable sein, habe deshalb eine Klasse ObservableObject, welche Listeners hält und diese gegebenenfalls updated. Weiter habe ich Datensätze, welche von dieser Klasse erben, die Klasse Record (abstract). Nun gibt es Records die aus der Datenbank kommen, meine DBRecord s. Für die View schreibe ich mir einige Helper klassen, damit ich mir einigen aufwand ersparen kann. Diese Views (Tables, Trees, Lists etc.) arbeiten jeweils mit Controllern die Records enthalten. Nun habe ich beim Tree so meine Probleme. Möchte ich zum Beispiel eine Ordner oder Kategoriestruktur abbilden, so kann dies ja per reflection gemacht werden (jeder Record hat eine Referenz auf seinen Parent etc.) Also muss jeder Record den ich im Tree vom Controller erhalte, ein ReflectableRecord sein. Wenn ich jetzt aber eine Klasse ReflectableRecord definiere die von Record erbt, müsste ich auch eine Klasse schreiben, welche ReflectableDBRecord heisst und von DBRecord erbt. Dies ist mir jedoch zu mühsam. ich könnte natürlich auch einfach ein Interface machen, Reflectable, und dann meine implementierungen von Record bzw. DBRecord auch dieses Interface implementieren lassen. Dann müsste ich im Tree jedoch bei jedem Record ein Casting oder instanceof machen, was mir einfach extrem abwägig klingt, denn wenn das dann so weiter geht, wird irgendwann zu umständlich, und irgendwie habe ich das gefühl, der OO gedanke geht so verloren. Wie macht ihr solche Sachen?

TIA

grüsse gegel


----------



## Wildcard (22. Jun 2006)

Ich weiß nicht wie die Beiden Klassen Record und DBRecord aussehen, aber vermutlich haben sie eine ähnliche API. Warum lässt du diese beiden nicht voneinander erben, oder gibst ihnen eine abstrakte Basisklasse?


----------



## insomnio (22. Jun 2006)

wenn ich hier ein bild posten könnte, würde ich dir gerne ein klassendiagram präsentieren.
ich versuchs mal in textform.

ObserveableData extends Object - abstrakte Klasse die 1:n ObservableDataListener registrieren und updaten kann
Record extends ObservableData - abstrakte Klasse die einen Datensatz repräsentiert
DBRecord extends Record - abstrakte Klasse welche einen Datensatz aus einer Datenbank darstellt, enthält methoden wie insert(), update(), delete() etc.

jetzt möcht ich noch Reflectable Records einführen, müsste dann jedoch zwei klassen schreiben, eine die DBRecord erweitert und eine die Record erweitert. in der TreeView müsste ich dann jeweils auf beide überprüfen, bzw. für jeden Controller (ReflectableDBController und ReflectableController) einen Konstruktor zur Verfügung stellen. Oder aber die Klasse ReflectableRecord erbt von Record und ReflectableDBRecord erbt ebenfalls von Record, stellt einfach die gleichen abstrakten Methoden wie DBRecord zur verfügung. Dann bräuchte ich aber wieder ein DB Interface, um beide Klassen identifizieren zu können...

Ist mein Problem nun klarer dargestellt?

Gruss


----------



## Wildcard (22. Jun 2006)

Ich denke auch das ein Klassendiagramm es deutlicher beschreiben würde.
Bilder kannst du bei imageshack hochladen.
Hört sich für mich aber so an als bräuchtest du ein Reflectable Interface das Record implementiert.


----------

