2009-07-09 8 views
10

J'apprends actuellement l'Objective-C et j'ai rencontré des méthodes optionnelles dans Protocoles. Mon arrière-plan est C# et peut voir un protocole comme quelque chose de similaire à une interface C#. Si une interface C# représente un contrat, en annonçant une interface, vous dites que vous allez implémenter les méthodes définies. En gardant cela à l'esprit, je ne comprends pas pourquoi vous auriez besoin de définir une méthode optionnelle. Ce n'est pas une insulte ou une tentative de diminuer Objective-C, j'aime Objective-C. Je veux simplement comprendre les avantages de ces méthodes optionnelles, afin de mieux comprendre le langage.Exemples réels de méthodes de protocole @optional

Je serais vraiment reconnaissant si quelqu'un pourrait fournir des scénarios du monde réel (avec un exemple de code) où les méthodes optionnelles sont utiles.

Répondre

14

Je vais vous donner un exemple. J'ai un certain nombre de classes ObjC qui parlent à l'API Flickr. Un, appelé FKAccount peut faire beaucoup de choses liées au compte d'un utilisateur Flickr, y compris le téléchargement des photos de l'utilisateur, obtenir leur liste de contacts et ainsi de suite.

La classe FKAccount définit un protocole délégué FKAccountDelegate. Ce protocole spécifie un nombre de méthodes de rappel que FKAccount invoquera sur son délégué en fonction du succès ou de l'échec de diverses opérations réseau sur Flickr. Toutes les applications utilisant FKAccount ne seront pas intéressées par toutes les opérations Flickr exécutées par FKAccount.

S'il était requis que chaque classe prétendant implémenter le protocole FKAccountDelegate implémente toutes les méthodes, vous obtiendriez beaucoup de méthodes stub (FWIW, il y a 41 méthodes définies dans FKAccountDelegate). Lorsque ces méthodes sont déclarées @optional dans le protocole, le délégué n'a qu'à implémenter les rappels qu'il souhaite recevoir.

Les FKAccount contrôles de classe que son délégué répond à @optional méthodes dans le protocole par:

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

Je pense que je reçois maintenant. Une interface C# est seulement une facette d'un protocole Objective-C. Vous pouvez utiliser un protocole en tant que contrat, mais ces méthodes facultatives constituent une liste de délégués facultatifs qu'un objet peut également choisir de répondre. C'est vraiment intéressant. – kim3er

+1

+1 pour l'utilisation d'un protocole pour documenter les fonctions déléguées –

+1

Je suis entièrement d'accord avec @Tom. Avant Objective-C 2.0, les méthodes déléguées étaient généralement déclarées dans une catégorie sur NSObject pour éviter que n'importe quelle classe voulant être un délégué n'ait à implémenter toutes les méthodes. Les méthodes facultatives dans les protocoles sont une solution beaucoup plus propre qui ne colle pas des tonnes de méthodes sur NSObject, et permet d'éviter les collisions de méthodes. Si seulement Java avait des méthodes d'interface optionnelles, il n'y aurait pas besoin d'hériter de MouseAdapter. Utiliser des classes comme ça sont généralement les quelques fois que j'ai maudit l'héritage unique ... :-) –