Ich bin wirklich verwirrt über die Art und Weise, wie Menschen Super in überschriebenen Methoden verwenden. Wie ist der Unterschied zwischen
%Vor%und
%Vor%Führt es eine Vorverarbeitung durch, wenn wir super () am Ende aufrufen, weil wir im Allgemeinen super aufrufen, um den Elternkonstruktor zu initialisieren.
Jeder Unterschied in der Leistung mit beiden Arten.
Erstens ist plain super()
in Methoden überhaupt nicht erlaubt - nur in Konstruktoren. Ich nehme an, du meintest eigentlich super.someMethod()
für eine geeignete Methode.
Führt es eine Vorverarbeitung durch, wenn wir am Ende super () aufrufen, weil wir im Allgemeinen super aufrufen, um den Elternkonstruktor zu initialisieren.
Die Verwendung von super
in einer Methode unterscheidet sich etwas von der Verwendung in einem Konstruktor.
In einem Konstruktor ist super
(oder this
) erforderlich , um die allererste Anweisung zu sein (falls vorhanden, mit einem impliziten super()
, sonst) und nur rufen Sie einen Konstruktor auf.
In einer Methode wird mit super.someMethod()
einfach die Superklassenimplementierung von someMethod
aufgerufen. Sie können es von any -Methode aufrufen (Sie müssen nicht someMethod
zu diesem Zeitpunkt überschreiben) und Sie können es jederzeit in der Methode aufrufen. Es wird an dem Punkt aufgerufen, an dem Sie es aufrufen, es vermeidet nur den polymorphen Aufruf einer übergeordneten Implementierung.
Also im Grunde, wo - und ob - Sie es nennen, hängt davon ab, was Sie wollen, dass der Effekt ist. In einigen Fällen möchten Sie > die Superklassenimplementierung der gleichen Methode vor Ihrem eigenen benutzerdefinierten Verhalten aufrufen, und in einigen Fällen möchten Sie > nach Ihrem eigenen benutzerdefinierten Verhalten aufrufen .
Das hängt wirklich von der Logik ab, die die Methode implementiert. Manchmal heißt es zuerst, manchmal am Ende und manchmal nie. Wenn beispielsweise eine Berechnung aus der Oberklassenmethode wirklich wichtig ist, wird sie zuerst aufgerufen. Oder wenn eine Berechnung in der Unterklassenmethode versucht wird, aber ohne ein gutes Ergebnis (Ergebnis ist Null), wird ein Versuch mit der Unterklassenmethode unternommen. Es gibt wirklich keine gute Antwort auf diese Frage, außer dass es wirklich darauf ankommt.
Beispiel 1:
Ein Label-Provider, der die Zeit vom Objekt Date
extrapoliert und zur Anzeige an die Benutzeroberfläche zurückgibt:
Ein Labelanbieter, der Datum und Uhrzeit aus dem Objekt Date
extrapoliert und zur Anzeige an die Benutzeroberfläche zurückgibt:
Beispiel 2:
Wenn Ihr Projekt eine tiefe Klassenhierarchie für Benutzeroberflächenelemente aufweist, z. B.
%Vor% Nun fügte jede Klasse dem Feld einige UI-Elemente hinzu, zum Beispiel fügte DropDownField
ein Menü und einen kleinen Pfeil rechts neben dem Feld hinzu, TextField
fügte einen Validator hinzu, AbstractTextField
fügte ein Weiß hinzu blockieren, um Text zu schreiben, etc ... Um Elemente zu disponieren, müßtest du mehrstufige Entsorgung wie folgt machen:
Sehen Sie sich die okPressed () - Methode für swt-Dialoge an. Normalerweise überschreiben die Benutzer okPressed in einem Dialog, um die gewünschte Arbeit zu erledigen. Die Option super.okPressed () deaktiviert normalerweise den Dialog, der nichts tut. So heißt es am Ende, nachdem all deine Arbeit erledigt ist.
%Vor%Das Schlüsselwort super ist eine Möglichkeit, das Verhalten einer Elternklasse in einer speziellen Klasse aufzurufen.
Rufen Sie in einem Konstruktor
auf %Vor% Mitkönnen Sie auswählen, welcher Konstruktor der Elternklasse verwendet werden soll.
In einer Methode
aufrufen %Vor% Mitkönnen Sie das Verhalten der Elternklasse aufrufen, selbst wenn die aktuelle Klasse parentMethod überschreibt. Normalerweise wird es verwendet, um eine Logik vor oder nach der Elternklasse hinzuzufügen.
Anrufen
%Vor%in einer Methode wird nicht kompiliert, da Sie die Konstruktor-Super-Syntax in einer Methode verwendet haben.
, ob Sie in der ersten Zeile oder in der letzten Zeile Ihrer Methode an die Super-Methode zurückrufen ... es hängt von der Semantik der Super-Methode ab. Mit anderen Worten, es gibt keine andere Möglichkeit, als die Dokumentation (oder den Code) für die Methode zu betrachten. Es kann auch Fälle geben, in denen Sie die Super-Methode überhaupt nicht aufrufen möchten.
Sie scheinen nach onResume()
zu fragen. Während die Dokumente nicht sagen, ist das Muster, das ich immer verwendet habe, in der ersten Zeile zu der Super-Methode zurückzurufen. Für onPause()
rufe ich in der letzten Zeile zurück. Die Idee ist, dass die Super-Methoden Ihre benutzerdefinierte Pause / Fortsetzen-Logik umhüllen ...