ich eine Methode String foo()
in einer abstrakten Klasse haben, die schon ein paar Vorberechnung tut aber das Endergebnis nicht liefern das Verfahren soll zurückzukehren. Was ich will, ist, dass jede nicht abstrakte Klasse, die von meiner abstrakten Klasse erbt, foo
so implementieren muss, dass zuerst super()
aufgerufen wird und dann das Ergebnis berechnet wird. Gibt es eine Möglichkeit, dies in Java zu erzwingen?Kraft nicht abstrakte Methode werden außer Kraft gesetzt
Antwort
Ja, durch die Neugestaltung der template method pattern und darunter eine abstrakte Methode zu verwenden:
public abstract class AbstractSuper {
public final String foo() {
// Maybe do something before calling bar...
String initialResult = bar();
// Do something common, e.g. validation
return initialResult;
}
protected abstract String bar();
}
Grundsätzlich, wenn Sie Subklassen erzwingen wollen, um eine Methode zu überschreiben, es tut abstrakt sein - aber das doesn‘ t muss die Methode sein, die von anderem Code aufgerufen wird ...
Gibt es eine Konvention, wie die beiden Methoden nennen? Ich würde ihnen den gleichen Namen geben (was natürlich nicht möglich ist), weil sie im Prinzip dasselbe tun. –
@ principal-ideal-domain Sind sie? Die Methode "abstract" führt einen anderen Teil der gesamten Berechnung aus, daher sollte sie einen entsprechenden Namen haben. Derselbe Name könnte zu Missverständnissen bei der Implementierung der abstrakten Methode in einer untergeordneten Klasse führen. – Tom
@Tom Ja, das stimmt. Es führt einen anderen Teil durch. Aber normalerweise rufe ich meine Methoden nach dem, was sie zurückgeben, und nicht nach dem, was sie tun. Zum Beispiel möchte ich in meinem aktuellen Fall nur die Anzahl der Methodenaufrufe zählen, so dass mein 'foo' wie' counter ++; Rücksprungleiste(); '. Übrigens: Ist es möglich, den Aufruf der abstrakten Methode in den Klassen zu verbieten, die sie implementieren? –
Es gibt keine Möglichkeit, dies in Java zu tun. Sie können jedoch eine weitere abstrakte Methode deklarieren und aufrufen. Wie folgt aus:
public final String foo() {
String intermediate = ... // calculate intermediate result;
return calculateFinalResult(intermediate);
}
protected abstract String calculateFinalResult(String intermediate);
So kann man gezwungen sein, calculateFinalResult
außer Kraft zu setzen. Kein Aufruf von super
Instanz ist notwendig. Auch Unterklassen können Ihre foo()
nicht so definieren, wie sie als final
deklariert ist.
Nur eine Anmerkung: Es ist eine gute Idee, eine geeignete Sortierung der Modifikatoren (z. B. "geschützt" und "abstrakt") zu verwenden. Sie finden eine empfohlene Sortierung hier: https://google-styleguide.googlecode.com/svn/trunk/javaguide.html#s4.8.7-modifiers. – Tom
So ähnlich?
public abstract class MyBean {
public final String foo(){
String preFinalResult = [...];
return doFinalResult(preFinalResult)
}
protected abstract String doFinalResult(String preFinal);
}
Es könnte eine gute Idee sein, den Modifikator 'doFinalResult' von' public' in 'protected' zu ändern, damit andere Klassen (außer Kindklassen und Klassen im selben Paket) nicht direkt darauf zugreifen können. – Tom
- 1. Methode muss außer Kraft gesetzt werden, ist aber nicht abstrakt?
- 2. Warum werden Optionen nicht außer Kraft gesetzt?
- 3. Hintergrundeigenschaften werden entfernt? Nicht außer Kraft gesetzt
- 4. Wie eine außer Kraft gesetzt Eigenschaft
- 5. Golang Methode außer Kraft setzen
- 6. außer Kraft setzen abstrakte Methode auf Instanzerstellung in C#
- 7. Realm Objekte außer Kraft gesetzt ist gleich Methode
- 8. Anruf Mutter Methode anstelle der außer Kraft gesetzt ein
- 9. Kann der Gültigkeitsbereich von pytest Fixtures außer Kraft gesetzt werden?
- 10. Kann die ValidateRequest-Einstellung einer Seite außer Kraft gesetzt werden?
- 11. Funktionen nicht außer Kraft setzen
- 12. außer Kraft setzt AccessTokenExpireTimeSpan
- 13. Außer Kraft setzen einer überschriebenen Methode (C#)
- 14. außer Kraft setzt Dialog
- 15. Verwirrend „eine private Methode außer Kraft setzen“
- 16. eine Standard-Methode außer Kraft setzen lambdas
- 17. Klasse ist nicht abstrakt und nicht außer Kraft setzt abstrakte Methode durchgeführt (Object, Throwable) in ParseCallback2
- 18. PHP erhalten außer Kraft gesetzt Methoden Kind Klasse
- 19. Warum kann ein Compiler die Methode nicht außer Kraft setzen?
- 20. Active finden außer Kraft setzen
- 21. Kann UILabels drawTextInRect-Methode außer Kraft gesetzt werden, um die Größe von UILabels Text zu ändern?
- 22. python-Anfragen - User-Agent außer Kraft gesetzt wird
- 23. Magento außer Kraft setzen Versandmethoden
- 24. Außer Kraft setzen in Clojure?
- 25. Überladen oder außer Kraft setzen?
- 26. In Python, die Methode hat außer Kraft gesetzt werden, um die Klassenvariablen
- 27. Warum wird dieser wichtige CSS-Wert außer Kraft gesetzt?
- 28. css Benutzerdefinierte außer Kraft gesetzt durch Bootstrap in Browser
- 29. Symfony2-Konsolenbefehle außer Kraft setzen?
- 30. „kann nicht die endgültige Methode von SherlockActivity außer Kraft setzen“
bitte die Methodensignatur für foo teilen –
Haben sie eine abstrakte Methode aufrufen, die die endgültigen Berechnungen oder Rückgabewert (e) zu muss entweder durchführen, die es braucht – MadProgrammer