Ich habe eine Problem mit Vererbung, Generizität und Collections. ich verstehe die grundproblematik, also zb warum man eine List<SomeObject> nicht auf List<Object> casten kann. ich verstehe auch das Prinzip, dass ein Untertyp einer Klasse überall verwendet werden können soll, wo der Obertyp erlaubt ist. und das ist es da eben probleme gibt, weil der compiler die korrektheit nicht garantieren kann, etc.
was mir oft nicht klar ist, ist, wie man dieses problem am besten umgeht
ich habe eine Klasse TableInfo, die Informationen wie die Größe, das Gewicht, etc. eines Tisches kapselt + ein paar Methoden anbieten, um damit zu arbeiten. Die TableInfo wird von einigen Klassen verwendet. diese brauchen nicht mehr Informationen/Methoden, als TableInfo bietet. passt also so wie es ist.
An einer Steller aber reicht TableInfo nicht aus. Dort ist zb auch die Farbe oder die Holzart des Tisches von Bedeutung. Ich brauche aber weiterhin alle Infos+Methoden, die schon TableInfo bereitstellt. Für mich erscheint es nun logisch, TableInfo zu erweitern: also zb TableMoreInfo extends TableInfo.
bis hierhin gibts kein problem.
nun hat ein Tisch aber noch eine Liste von Dingen, die sich auf ihm befinden (Stifte, Bücher, etc.) und auch über diese Dinge gibt es Information
--> List<ThingInfo>
das große problem ist nun, dass ein TableMoreInfo Objekt auch eine List<ThingMoreInfo> benötigt.
ich frage mich nun, wie man sowas am besten löst. auf die vererbung zwischen TableInfo und TableMoreInfo will ich nicht verzichten, da ich den gesamten Code dann rüberkopieren müsste (und bei jeder Änderung an beiden Stellen ändern). eine überlegung war, die ThingMoreInfo objekte in die List<ThingInfo> zu schreiben. und beim Zugriff auf Elemente dieser Liste von TableMoreInfo aus einfach alle Elemente auf ThingMoreInfo zu casten. das problem, dass ich dann überall im code sehr viele casts hätte. was ich dann probiert habe, ist, einfach Methoden anzubieten, die aus der List<ThingInfo> von TableInfo eine List<ThingMoreInfo> erzeugen. (mit casts) und diese dann anbieten. das klappt eigentlich ganz gut und es sind fast alle casts weg. leider hat das aber natürlich den nachteil, dass es sich nicht mehr um die originalliste handelt. bei änderungen am original, ändert sich die kopie nicht.
meine nächste variante wären zwei listen, also die aus TableInfo plus eine weitere in TableMoreInfo und diese dann immer am selben Stand halten. damit hätte ich zwei eigentlich komplett idente liste, nur eben unterschiedlich typisierte list-referenzen. naja, auch nicht schön.
gibts für sowas ein designpattern bzw. ne patentlösung, wie es am besten gemacht wird?
danke schon mal!
was mir oft nicht klar ist, ist, wie man dieses problem am besten umgeht
ich habe eine Klasse TableInfo, die Informationen wie die Größe, das Gewicht, etc. eines Tisches kapselt + ein paar Methoden anbieten, um damit zu arbeiten. Die TableInfo wird von einigen Klassen verwendet. diese brauchen nicht mehr Informationen/Methoden, als TableInfo bietet. passt also so wie es ist.
An einer Steller aber reicht TableInfo nicht aus. Dort ist zb auch die Farbe oder die Holzart des Tisches von Bedeutung. Ich brauche aber weiterhin alle Infos+Methoden, die schon TableInfo bereitstellt. Für mich erscheint es nun logisch, TableInfo zu erweitern: also zb TableMoreInfo extends TableInfo.
bis hierhin gibts kein problem.
nun hat ein Tisch aber noch eine Liste von Dingen, die sich auf ihm befinden (Stifte, Bücher, etc.) und auch über diese Dinge gibt es Information
--> List<ThingInfo>
das große problem ist nun, dass ein TableMoreInfo Objekt auch eine List<ThingMoreInfo> benötigt.
ich frage mich nun, wie man sowas am besten löst. auf die vererbung zwischen TableInfo und TableMoreInfo will ich nicht verzichten, da ich den gesamten Code dann rüberkopieren müsste (und bei jeder Änderung an beiden Stellen ändern). eine überlegung war, die ThingMoreInfo objekte in die List<ThingInfo> zu schreiben. und beim Zugriff auf Elemente dieser Liste von TableMoreInfo aus einfach alle Elemente auf ThingMoreInfo zu casten. das problem, dass ich dann überall im code sehr viele casts hätte. was ich dann probiert habe, ist, einfach Methoden anzubieten, die aus der List<ThingInfo> von TableInfo eine List<ThingMoreInfo> erzeugen. (mit casts) und diese dann anbieten. das klappt eigentlich ganz gut und es sind fast alle casts weg. leider hat das aber natürlich den nachteil, dass es sich nicht mehr um die originalliste handelt. bei änderungen am original, ändert sich die kopie nicht.
meine nächste variante wären zwei listen, also die aus TableInfo plus eine weitere in TableMoreInfo und diese dann immer am selben Stand halten. damit hätte ich zwei eigentlich komplett idente liste, nur eben unterschiedlich typisierte list-referenzen. naja, auch nicht schön.
gibts für sowas ein designpattern bzw. ne patentlösung, wie es am besten gemacht wird?
danke schon mal!