2016-07-31 7 views
7

Meine Mitarbeiter werden manchmal Super beim Überschreiben einer IOS-Methode und manchmal nicht nennen. Dies scheint hauptsächlich auf ihre Erfahrung zurückzuführen zu sein. Gibt es eine Faustregel für die Entscheidung, ob Super angerufen werden soll oder nicht?Wann Super beim Überschreiben von Ios-Methoden zu verwenden ist

Ex:

// Has super 
override func awakeFromNib() { 
    super.awakeFromNib() 
} 

// No super 
override func drawRect(rect: CGRect) { 
} 
+2

Die Faustregel lautet "lese die Dokumente". – matt

+1

@matt Ihr Kommentar hilft niemand, bitte geben Sie einen Verweis auf die Dokumente oder einen anderen SO-Post. https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Inheritance.html#//apple_ref/doc/uid/TP40014097-CH17-ID196 – alexisSchreier

+0

@alexisSchreier Ich stimme nicht zu. Ich habe die Frage sehr direkt, prägnant und korrekt beantwortet. Um zu wissen, ob Super bei der Implementierung von 'watchFromNib' aufgerufen werden soll, müssen Sie die Dokumentation zu' watchFromNib' lesen. Und so weiter. Es gibt keinen kürzeren Weg. Mein Kommentar hilft _jeverybody_. – matt

Antwort

5

Es gibt keine Faustregel, ob Sie die Superimplementierung einer bestimmten Methode aufrufen sollen oder nicht. Dies sollte von Fall zu Fall entschieden werden, abhängig von den Empfehlungen aus der Dokumentation für die Umsetzung der Methode der Superklasse und Ihren Anforderungen.

Nur um zu erklären, warum die beiden Beispiele, die Sie enthalten könnten, wie sie sind, werden wir in der Dokumentation zu -[UIView drawRect:] aussehen kann, in dem es heißt:

Wenn Sie UIView Unterklasse der Implementierung dieser Methode direkt, muss nicht super anrufen. Wenn Sie jedoch eine andere Sichtklasse unterklassifizieren, sollten Sie Super an einem bestimmten Punkt in Ihrer Implementierung aufrufen.

und die Dokumentation für -[NSObject awakeFromNib], in dem es heißt:

Sie müssen die Super Implementierung von awakeFromNib rufen Sie die Möglichkeit zu geben, Eltern Klassen zusätzliche Initialisierung durchzuführen sie benötigen . Obwohl die Standardimplementierung dieser Methode nichts ist, bieten viele UIKit-Klassen nicht leere Implementierungen.

Die meiste Zeit ist es wahrscheinlich eine sichere Wette, dass Sie die Super-Implementierung einer Methode nennen sollten (siehe Kommentare unten). Beachten Sie jedoch, dass einige Methoden erfordern, dass Sie ihre Superimplementierung aufrufen, andere nicht, und einige erfordern sogar, dass Sie die Superimplementierung an einem bestimmten Punkt in der Überschreibung aufrufen. Bedenken Sie daher im Zweifelsfall immer die Dokumentation.

+3

Ich würde das anders beantworten. Für beginnende Entwickler würde ich sagen "rufe immer die Super-Implementierung an". Wenn der Compiler beschwert, dass die Methode nicht definiert ist, entfernen Sie den Aufruf. Manchmal müssen Sie nicht superaufrufen, weil die Superimplementierung der Basisklasse nichts tut, aber es ist sicherer, sie aufzurufen, wenn Sie es nicht brauchen, um sie nicht aufzurufen, wenn Sie es brauchen. –

+1

@DuncanC Das ist ein guter Punkt. Der Aufruf von Super im Zweifelsfall ist wahrscheinlich eine sicherere Standardposition für den allgemeinen Fall. Obwohl (und ich denke nicht an ein Beispiel) kann es sein, dass die Superimplementierung einer Methode Nebenwirkungen hat, die den Zustand ändern, in dem sich auch der Code in der Implementierung Ihrer Unterklasse geändert hat. In diesem Fall wäre die Platzierung des Super-Calls innerhalb Ihrer Überschreibung von Bedeutung und könnte zu weiterer Verwirrung führen. –

+2

Ich glaube, die Norm ist, die Super-Version zuerst zu nennen, dann fügen Sie Ihren benutzerdefinierten Code hinzu. Auf diese Weise werden alle Änderungen, die Sie an der Methode vornehmen, angewendet, nachdem die Superimplementierung ihre Aufgabe erledigt hat. –

0

eine Nachricht an Super Senden sind ein Weg, auf ein Verfahren der Umsetzung von einer übergeordneten Klasse weiter oben in der Vererbungskette definiert nennen durch. Die häufigste Verwendung von Super ist das Überschreiben einer Methode. Durch den Aufruf von super wird die Elternklasse vorbereitet. Wenn Sie eine Methode überschreiben, müssen Sie super aufrufen, sonst haben Sie möglicherweise einen ungültigen Status, da die Superklassenimplementierung einige Zustände nicht initialisiert hat.

+1

"Wenn Sie eine Methode überschreiben, müssen Sie super aufrufen." Das ist nicht der Fall - es hängt von der jeweiligen Methode ab, ob sie es sein muss oder nicht. – Gruntcakes

+0

Ja, zum Beispiel ['UIViewController loadView'] (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/index.html#//apple_ref/occ/instm/UIViewController/loadView) explizit sagt: "Ihre benutzerdefinierte Implementierung dieser Methode sollte nicht super aufrufen." Mein Ratschlag ist immer die Dokumentation zu überprüfen und im Zweifelsfall standardmäßig Super zu nennen, wenn die Dokumentation nicht sagt.Eine nette Sache über Android vs. iOS ist, dass Sie den Quellcode haben und sehen können, was Super eigentlich tut. : -/ –

+0

@i_am_jorf Ich sehe das nirgendwo in diesem Dokumentenlink. –