2013-05-29 3 views
7

Gestern fragte ein Kollege, warum wir nicht eine init-Methode (initWith ...: (...)) in einem Protokoll deklarieren sollten, um implementierende Klassen zu zwingen, einen solchen Initialisierer zu liefern. Ich war über diese Frage ziemlich überrascht und nach meinem Verständnis ist das Unsinn. Aber ich konnte keinen definitiven Grund finden, aber das Erklären einer Init-Methode in einem Protokoll führt zu weniger Flexibilität für die Implementierungen.Ziel c init im Protokoll

Könnten Sie mir bitte einen guten Grund nennen, warum sollte es eine Init-Methode in einem Protokoll geben oder nicht?

Danke!

Antwort

6

Sie definieren Methoden in Protokollen, sodass Ihr Code von anderen implementierte Methoden aufrufen kann. Der „Vertrag“ zwischen Ihnen und Entwickler Ihr Protokoll implementiert sieht wie folgt aus:

  • Sie das Protokoll definieren,
  • Jemand anderes Ihr Protokoll implementiert,
  • Jemand anderes ein Objekt erstellt Umsetzung Ihr Protokoll, und gibt es Ihnen, so
  • Sie können Methoden Ihres Protokolls aufrufen, ohne ihre Implementierung zu kennen.

Um Methoden Ihres Protokolls aufzurufen, benötigen Sie eine Instanz eines Objekts, das es implementiert. Der wichtigste Punkt beim Definieren von Protokollen ist das Entfernen von Wissen über die Klasse, die Ihr Protokoll implementiert, aus Ihrem Code: Wenn Sie wissen, welche Klasse Sie erhalten werden, können Sie das Protokoll ebenso überspringen und direkt zur Klasse programmieren. Wenn Sie jedoch Ihre init anrufen möchten, müssen Sie entweder die Klasse kennen, oder jemand anderes muss Ihnen ein alloc -ed-Objekt übergeben, auf dem die init noch nicht aufgerufen wurde. Keine der beiden Alternativen ist eine gute Idee - die erste Option tötet den Zweck, Protokolle zu haben, und die zweite zwingt Ihre Anrufer, in teilweise initialisierten Objekten zu handeln.

Beachten Sie, dass es nicht Sie davon ab, nicht init Konfigurationsmethoden in einem Protokoll nicht verhindern: Wenn alle Objekte mit bestimmten Bits von Informationen konfiguriert werden müssen, lassen Sie Ihre Benutzer was auch immer init implementieren, die sie wollen, und fügen Sie eine configureWith:... Methode Ihr Protokoll, mit dem Sie den Prozess der Konfiguration des Objekts steuern können, ohne die Methode init zu kennen.

+0

Könnte es sein, dass dies eine normale Praxis ist, wenn nicht ** Jemand anderes ** erstellt das Objekt, das die Schnittstelle implementiert, aber ** Sie **? – SeriousBob

+0

@SeriousBob Wenn Sie das Objekt erstellen, kennen Sie seinen Typ und alle implementierten Protokolle. In diesem Fall ist es nicht länger notwendig, zu wissen, dass "init" (oder für jede andere Methode) Teil eines Protokolls ist. – dasblinkenlight

+0

Okay, warum hat das NSCoding-Protokoll eine Methode initWithCoder:? – SeriousBob

3

Ich kenne einige Protokolle in iOS SDK, die init ... Methoden hat. Zum Beispiel NSCoding Protocol hat - InitWithCoder: erforderliche Methode. Ich denke, es ist normale Praxis.