Wann hätte eine Klasse jemals mehr als einen designierten Initialisierer?

8

Lesen Sie Apples Dokumentation zu Tipps und Techniken für Framework-Entwickler < Ich stieß auf diese Aussage über designierte Initialisierer:

  

Ein designierter Initialisierer ist eine Init-Methode einer Klasse, die ein    init Methode der Oberklasse. (Andere Initialisierer rufen init auf   Methoden, die von der Klasse definiert werden.) Jede öffentliche Klasse sollte one oder haben   mehr als Initialisierer bezeichnet.

(Hervorhebung hinzugefügt.)

Nach meinem Verständnis - und tatsächlich, die Verwendung des Wortes "designed" - sollte eine Klasse nur einen bestimmten Initialisierer haben. Aber gemäß der Dokumentation sind mehrere designierte Initialisierer akzeptabel.

Unter der Annahme, dass Sie zwei (oder mehr) designierte Initialisierer haben, besteht ihre Rolle darin, den benannten Initialisierer der Superklasse aufzurufen, um eine korrekte Objektinitialisierung zu garantieren. Aber wenn beide designierten Initialisierer den benannten Initialisierer der gleichen Superklasse aufrufen, warum war dann die Notwendigkeit für mehr als einen an erster Stelle? Sollte die Klasse nicht refaktoriert werden, um alle anderen init -Methoden auf den singular designed initializer zu leiten?

Ich bin nur ein wenig verwirrt, was Use Case oder Design-Muster für mehrere designierte Initialisierer erfordern würde?

    
LucasTizma 21.09.2011, 14:56
quelle

1 Antwort

6

Sie würden dies tun, wenn Sie eine andere Initialisierung für verschiedene Objekte derselben Klasse wünschen. Ein Beispiel sind Klassencluster wie NSNumber. Es hat einige Initialisierer für die verschiedenen Arten von Zahlen, die sie halten können. Um die genaueste Darstellung zu liefern, sollte die Klasse ihren Wert im selben Format behalten, in dem sie ihn erhalten hat, anstatt zu werfen. Dies bedeutet, dass die Initialisierer nicht einfach einen gemeinsamen Initialisierer aufrufen und zurückkehren können. Sie müssen einige benutzerdefinierte Arbeit erledigen. Dies macht sie zu einem designierten Initialisierer.

Ein anderes Beispiel wäre eine Dokumentklasse, die nur für neue Dateien eine Initialisierung und für geöffnete Dokumente eine andere Initialisierung benötigt. Beide Initialisierer rufen ihre Superimplementierung auf, die wiederum die einfache init -Methode aufruft, um eine gemeinsame Initialisierung durchzuführen. Da sie jedoch mehr tun als einfach einen anderen Initialisierer mit einem Standardwert aufzurufen, gelten sie als initialisierte Initiatoren.

    
ughoavgfhw 21.09.2011, 15:08
quelle