Bin gerade auf ein kleines (?) Designproblem gestoßen:
Ich habe Entry Objekte, die in einem Set gelagert werden, und deren equals/hashCode Methoden so überschrieben sind, dass die Identität nur vom Attribut name abhängt.
Weiter habe ich Objekte TitledEntry, die das gleiche sind wie ein Entry, zusätzlich aber ein Attribut title und zugehörige Methoden haben.
Nun soll aber ein beliebiges Entry Objekt ungleich eines beliebigen TitledEntry Objekts sein; der Titel ändert also die Identität des Entry's.
Da ich ein TitledEntry genauso benutzen will, wie ein Entry, macht erben von Entry eigentlich Sinn..
In TitledEntry überschreibe ich dann die equals/hashCode Methoden so, dass sie Name und Titel
miteinbeziehen...
Und dann bekomme ich sowas:
Und das is ja vollkommen wirr.
Ich könnte folgendes machen:
Entweder
1) Ich überprüfe in der equals Methode der Entry Klasse, ob das übergebe Objekt ein Entry oder ein TitledEntry ist.
Oder
2) Ich lasse TitledEntry nicht von Entry erben, sondern erstelle in TitledEntry ein Attribut vom Typ Entry; und leite dann alle Methoden auf das Attribut um..
Beides blöd =/
Bei 1) muss die Oberklasse von der Unterklasse wissen, was nicht sonderlich sinnvoll ist, dann kann ich auch gleich das Attribut title in die Oberklasse reinnehmen.
Und 2) ist wie ich finde sehr umständlich und unsauber.
Im Prinzip könnte ich schon das zusätzliche Attribut title mit in die Oberklasse schreiben, aber was ist wenn ich nicht nur 1 Attribut hinzufügen will, sondern ganz viele?
Dann habe ich in der Oberklasse etliche Attribute, die nie benutzt werden, das will ja auch niemand.
Bessere Lösungsvorschläge?
Ich habe Entry Objekte, die in einem Set gelagert werden, und deren equals/hashCode Methoden so überschrieben sind, dass die Identität nur vom Attribut name abhängt.
Weiter habe ich Objekte TitledEntry, die das gleiche sind wie ein Entry, zusätzlich aber ein Attribut title und zugehörige Methoden haben.
Nun soll aber ein beliebiges Entry Objekt ungleich eines beliebigen TitledEntry Objekts sein; der Titel ändert also die Identität des Entry's.
Da ich ein TitledEntry genauso benutzen will, wie ein Entry, macht erben von Entry eigentlich Sinn..
In TitledEntry überschreibe ich dann die equals/hashCode Methoden so, dass sie Name und Titel
miteinbeziehen...
Und dann bekomme ich sowas:
Java:
Entry e = new Entry("Name");
TitledEntry t = new TitledEntry("Name", "Title");
//Soll beides false ergeben:
e.equals(t) // ergibt true
t.equals(e) // ergibt false
Und das is ja vollkommen wirr.
Ich könnte folgendes machen:
Entweder
1) Ich überprüfe in der equals Methode der Entry Klasse, ob das übergebe Objekt ein Entry oder ein TitledEntry ist.
Oder
2) Ich lasse TitledEntry nicht von Entry erben, sondern erstelle in TitledEntry ein Attribut vom Typ Entry; und leite dann alle Methoden auf das Attribut um..
Beides blöd =/
Bei 1) muss die Oberklasse von der Unterklasse wissen, was nicht sonderlich sinnvoll ist, dann kann ich auch gleich das Attribut title in die Oberklasse reinnehmen.
Und 2) ist wie ich finde sehr umständlich und unsauber.
Im Prinzip könnte ich schon das zusätzliche Attribut title mit in die Oberklasse schreiben, aber was ist wenn ich nicht nur 1 Attribut hinzufügen will, sondern ganz viele?
Dann habe ich in der Oberklasse etliche Attribute, die nie benutzt werden, das will ja auch niemand.
Bessere Lösungsvorschläge?