2009-07-09 9 views
10

Ich lerne Objective-C im Moment und habe über optionale Methoden in Protokolle. Mein Hintergrund ist C# und kann ein Protokoll als etwas sehen, das einer C# -Schnittstelle ähnlich ist.Echte Welt Beispiele für @optional Protokoll Methoden

Wenn eine C# -Schnittstelle einen Vertrag darstellt, sagen Sie durch Werbung für eine Schnittstelle, dass Sie die definierten Methoden implementieren werden.

In diesem Sinne bin ich verwirrt, warum Sie jemals eine optionale Methode definieren müssten. Das ist kein Bock oder ein Versuch, Objective-C zu verringern, ich liebe Objective-C. Ich möchte einfach die Vorteile dieser optionalen Methoden verstehen, um ein besseres Verständnis der Sprache zu erlangen.

Ich würde es wirklich schätzen, wenn jemand einige reale Szenarien (mit Beispielcode) bereitstellen könnte, wo optionale Methoden nützlich sind.

Antwort

14

Ich gebe Ihnen ein Beispiel. Ich habe eine Reihe von ObjC-Klassen, die mit der Flickr-API kommunizieren. Eine, die FKAccount genannt wird, kann viele Dinge tun, die mit dem Konto eines Flickr-Benutzers zusammenhängen, einschließlich des Herunterladens der Fotos des Benutzers, der Beschaffung ihrer Kontaktliste und so weiter.

Die Klasse FKAccount definiert ein Delegatenprotokoll FKAccountDelegate. Dieses Protokoll gibt eine Anzahl von Rückrufmethoden an, die FKAccount in Abhängigkeit von dem Erfolg oder dem Fehlschlagen verschiedener Netzwerkvorgänge bei Flickr auf seinem Delegaten aufruft. Nicht jede Anwendung, die FKAccount verwendet, wird an jeder Flickr-Operation interessiert sein, die FKAccount ausführen kann.

Wenn es erforderlich wäre, dass jede Klasse, die behauptet, das FKAccountDelegate Protokoll zu implementieren, jede Methode implementiert, würden Sie mit einer Menge von Stub-Methoden enden (FWIW, gibt es 41 Methoden in FKAccountDelegate definiert). Wenn diese Methoden im Protokoll als @optional deklariert sind, muss der Delegat nur die Rückrufe implementieren, die er empfangen möchte.

Die FKAccount Klasse überprüft, ob ihr Beauftragter in dem Protokoll zu @optional Methoden reagiert, indem er:

if([self.delegate respondsToSelector: @selector(accountDidDownloadContacts:)]) { 
    [self.delegate accountDidDownloadContacts: self]; 
} 
+0

Ich glaube, ich bin es jetzt bekommen. Eine C# -Schnittstelle ist nur eine Facette eines Objective-C-Protokolls. Sie können ein Protokoll als Vertrag verwenden, aber diese optionalen Methoden bilden eine Liste von optionalen Delegaten, auf die ein Objekt auch antworten kann. Das ist wirklich interessant. – kim3er

+1

+1 für die Verwendung eines Protokolls zur Dokumentation von Delegiertenfunktionen –

+1

Ich stimme @Tom vollkommen zu. Vor Objective-C 2.0 wurden Delegatmethoden normalerweise in einer Kategorie in NSObject deklariert, um zu vermeiden, dass eine Klasse, die ein Delegat sein möchte, alle Methoden implementieren muss. Optionale Methoden in Protokollen sind eine viel sauberere Lösung, die nicht viele Methoden auf NSObject anwendet und Methodenkollisionen vermeidet. Wenn nur Java über optionale Schnittstellenmethoden verfügte, wäre es nicht nötig, Dinge wie MouseAdapter zu erben. Mit solchen Klassen sind in der Regel die wenigen Male, die ich Single-Verehrung verflucht habe ... :-) –

Verwandte Themen