Also habe ich ein paar vererbte Klassen wie so definiert.Java-Polymorphie und Methodenverkettung
class Base {
public Base chainedMethodA() {
// some stuff
return this;
}
}
class Derived extends Base {
public Derived chainedMethodB() {
// some stuff
return this;
}
}
Nun wird der folgende Code funktioniert:
Derived obj = new Derived();
obj.chainedMethodB().chainedMethodA();
Aber dies nicht (man beachte die geänderte Reihenfolge der Funktionsaufrufe):
Derived obj = new Derived();
obj.chainedMethodA().chainedMethodB();
Der Compiler gibt einen Fehler auf dem chainedMethodB()
Funktionsaufruf Ich kann verstehen, dass dies daran liegt, dass beim Ausführen von ein Objekt vom Typ Base
zurückgegeben wird, für das chainedMethodB
nicht definiert ist.
Ich kann für dieses Problem von wenigen Lösungen denken:
- Ketten Methoden während Aufmerksamkeit (nennen wir
Derived
‚s Methoden zuerst, und dann rufenBase
‘ s Methoden) auf Bestellung. Das sieht nach einer sehr spröden Lösung aus. - Überschreiben
chainedMethodA
inDerived
, so dass es eine InstanzDerived
anstelle vonBase
zurückgibt. Das sieht nach einer Verschwendung von Erbschaft aus.
Gibt es einen eleganten Weg um dieses Problem? Vielleicht ein Konstrukt, das auf magische Weise chainedMethodA
ändert, um eine Derived
Instanz zurückzugeben, wenn es von einem Objekt des Typs Derived
aufgerufen wird, ohne explizit in Derived
überschrieben zu werden.
2 nicht eine Verschwendung von Vererbung ist. Es ist, was Vererbung ist: override, um etwas spezifischer zu tun, in diesem Fall: einen spezifischeren Typ zurückgeben. – Tunaki
@TI Sicher wird es: Sie können überschreiben und erklären, einen spezifischeren Typ zurückzugeben. Mit '@Override public Abgeleitetes chainedMethodA() {...}' – Tunaki
Beachten Sie, dass, wenn Sie wollen, dass 'Derived's' chainedMethodA' eine Instanz von 'Derived' zurückgibt, die Superimplementierung trotzdem nicht aufrufen kann (weil das eine tatsächliche 'Basis' zurückgeben könnte, die nicht 'abgeleitet' ist). Du verlierst also nichts auf diese Weise und erlaubst dir, dass "abgeleitete" Objekte immer noch als Basis verwendet werden. –