Ursprünglich hatte ich ein Design-Problem, bei dem ich fünf Unterklassen einer Oberklasse brauchte, von denen alle bis auf zwei dieselbe generische Methode verwenden würden, während die anderen beiden Klassen eine spezielle Behandlung benötigen würden. Ich wollte vermeiden, die Methode fünfmal zu schreiben: zwei Sonderfälle und drei identische Fälle.
So hatte ich jede Klasse erben SuperClass, und seine doSomething() Methode, und hatte SubClassSpecial1 und SubClassSpecial2 überschreiben mit ihren eigenen doSomeThing Methode.
Das war alles in Ordnung, bis ich eine Methode schrieb, die in etwa so aussah
void fooBar(SuperClass obj) {
obj.doSomething()
}
und es könnte aufgerufen werden als fooBar( new SubClassSpecial1() );
Das Problem ist, dass die Laufzeitklasse des obj
Variable ist nun die der Oberklasse und ruft daher die in der Oberklasse definierten Methoden auf. Ich könnte natürlich eine abstrakte doSometing()-Methode in der Oberklasse erstellen und jede Unterklasse ihre eigene Version implementieren lassen, aber das würde den Code in drei der Klassen duplizieren. Und das möchte ich vermeiden ...
Ich würde alle Vorteile der Polymorphie verlieren, wenn ich eine Menge Verzweigungen durch
if(obj.getClass().getName() == "SubClassSpecial1" ) ((SubClassSpecial1) obj).doSomething()K;
else if ...
Was sollte ich also tun, um das Design eleganter und nicht hakelig zu gestalten?