Angenommen, wir haben eine abstrakte Klasse A
und wir wollen alle Unterklassen zwingen, ein bestimmtes Feld zu haben. Dies ist in Java nicht möglich, da abstrakte Felder nicht definiert werden können.Wie kann man den Mangel an abstrakten Feldern in Java umgehen?
Problemumgehung 1: Erzwingen Sie Unterklassen, um eine Methode zu implementieren, die den gewünschten Wert liefert.
abstract class A {
abstract int getA();
}
Drawback: Jede Unterklasse hat eine Methode für jedes abstraktes Feld implementieren wir haben wollen. Dies kann zu vielen Methodenimplementierungen führen.
Vorteil: Wir können die Methode getA
in der abstrakten Klasse verwenden und implementieren Methoden mit ihm in A
ohne sie in jeder Unterklasse zu implementieren. Der Wert hinter der Methode kann jedoch nicht von der abstrakten Klasse überschrieben werden.
Abhilfemaßnahme 2: die abstrakte Feld Simulieren der Unterklasse durch Erzwingen der abstrakten Klasse einen Wert zu geben.
abstract class A {
int a;
public A(int a) {
this.a = a;
}
}
Drawback: Wenn wir mehrere Felder (> 10), der Super-Konstruktoraufruf aussehen wird ein bisschen hässlich und verwirrend haben.
Vorteil: Wir können das Feld a
in der abstrakten Klasse verwenden und implementieren Methoden mit ihm in A
ohne sie in jeder Unterklasse zu implementieren. Außerdem kann der Wert a
von der abstrakten Klasse überschrieben werden.
Frage: Welcher Workaround ist der übliche Weg, um das Ziel zu erreichen? Vielleicht gibt es einen besseren als die oben genannten?
Fehle ich etwas? Warum geben Sie der abstrakten Klasse nicht einfach ein geschütztes * konkretes * Feld? Warum der Wunsch nach einem "abstrakten" Feld? Was ist ein abstraktes Feld? Was fehlt mir noch oder verstehe ich nicht? Übertreibe ich Ihr Problem zu sehr? Und welches Verhaltensproblem (nicht Codeproblem) versuchen Sie ohnehin zu lösen? –
Oder Sie können eine Standardimplementierung von 'getA()' bereitstellen und sie einfach überschreiben, wo Sie einen anderen Wert wünschen. – Keppil
_Warum_ wollen Sie alle Unterklassen zwingen, ein Feld zu haben? Das Problem ist in der Regel besser formuliert, um sie zu einem bestimmten Verhalten zu zwingen, das Sie nur mit Methodenspezifikationen durchführen. –