51 votes

Protocole informel en Objective-C ?

Je me demandais si quelqu'un pouvait m'expliquer ce que sont les protocoles informels en Objective C ? J'ai essayé de le comprendre en consultant la documentation d'Apple et d'autres livres, mais j'ai toujours la tête qui tourne, alors j'apprécierais vraiment que quelqu'un puisse l'expliquer avec un exemple.

Gracias.

59voto

bbum Points 124887

Un site protocole informel était, comme l'a dit Jonnathan, typiquement une catégorie déclarée sur NSObject sans implémentation correspondante (le plus souvent - il y en avait une rare qui fournissait des implémentations factices sur NSObject).

Depuis la version 10.6 (et dans le SDK de l'iPhone), ce motif n'est plus utilisé. Plus précisément, ce qui était déclaré comme suit en 10.5 (et avant) :

@interface NSObject(NSApplicationNotifications)
- (void)applicationWillFinishLaunching:(NSNotification *)notification;
...
@interface NSObject(NSApplicationDelegate)
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender;
...

Est maintenant déclaré comme :

@protocol NSApplicationDelegate <NSObject>
@optional
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender;
...
- (void)applicationWillFinishLaunching:(NSNotification *)notification;
...

En d'autres termes, les protocoles informels sont désormais déclarés comme @protocol avec un groupe de @optional méthodes.

Quoi qu'il en soit, un protocole informel est un ensemble de déclarations de méthodes dont vous pouvez éventuellement implémenter les méthodes pour modifier le comportement. Généralement, mais pas toujours, les implémentations de méthodes sont fournies dans le contexte de la délégation (la source de données d'une vue de table doit implémenter une poignée de méthodes requises et peut éventuellement implémenter quelques méthodes supplémentaires, par exemple).

9voto

Daniel Yankowsky Points 3719

L'un des exemples courants de protocoles informels consiste à définir des rappels. Supposons que vous utilisez une bibliothèque qui vous permet de télécharger quelque chose en arrière-plan. Cette bibliothèque vous permet d'enregistrer un objet de rappel qui sera appelé une fois le téléchargement terminé.

- (void)download:(NSURL*)url whenComplete:(id)callback

Lorsque le téléchargement est terminé, il appelle une méthode particulière sur votre objet de rappel :

- (void)downloadComplete:(NSURL*)url

Bien sûr, il n'y a aucune garantie que votre objet de rappel implémente réellement cette méthode. Les protocoles informels fournissent des implémentations triviales de ces méthodes sur les objets suivants NSObject en utilisant une catégorie. Par conséquent, tous les objets du système répondront à la commande downloadComplete: bien qu'ils ne fassent rien en réponse à cette méthode par défaut. Les classes qui surchargent la méthode downloadComplete: peut fournir une fonctionnalité plus utile.

Jusqu'à présent, vous pouvez accomplir la même chose avec un protocole formel. Cependant, les protocoles informels vous permettent d'avoir des méthodes optionnelles. Une classe qui implémente un protocole formel doit fournir une implémentation pour chaque méthode du protocole. Une classe qui implémente un protocole informel peut omettre l'implémentation de toute méthode - elle a déjà hérité d'une implémentation de la classe NSObject .

Depuis Objective-C 2.0, les protocoles formels peuvent contenir des méthodes optionnelles. En outre, Apple pourrait abandonner les protocoles informels pour les nouvelles API. UIAccelerometerDelegate est un protocole formel.

5voto

Amol Manwatkar Points 51

Nous définissons un informal protocol en regroupant les méthodes dans une déclaration de catégorie,

@interface NSObject ( MyXMLSupport )
- initFromXMLRepresentation:(NSXMLElement *)XMLElement;
- (NSXMLElement *)XMLRepresentation;
@end

Informal protocol sont généralement déclarés comme des catégories de l NSObject Puisque cela associe largement les noms de méthode à toute classe qui hérite de la classe NSObject .

Parce que toutes les classes héritent de la classe Root, les méthodes ne sont pas limitées à une partie de la hiérarchie d'héritage. (Il serait également possible de déclarer un site informal protocol comme une catégorie d'une autre classe pour la limiter à une certaine branche de la hiérarchie d'héritage, mais il y a peu de raisons de le faire).

Lorsqu'elle est utilisée pour déclarer un protocole, une interface de catégorie n'a pas d'implémentation correspondante. À la place, les classes qui implémentent le protocole déclarent à nouveau les méthodes dans leur propre fichier d'interface et les définissent avec d'autres méthodes dans leurs fichiers d'implémentation.

5voto

HDA Points 2590

Protocoles informels sont un possibilité d'ajouter des méthodes facultatives à un objet par le biais de la catégorie .

Un doute peut donc surgir

Cela deviendra-t-il un protocole informel s'il y a des méthodes optionnelles sur le protocole lui-même ?

La réponse est non.

Si les méthodes sont déclarées dans le protocole et que l'on dit qu'il est conforme à une classe sans aucune utilisation de la catégorie alors c'est protocole formel .

Nota:

Les méthodes optionnelles dans le protocole ont été introduites dans l'objectif c 2.0. Avant cela, l'objectif était atteint par le biais d'un protocole informel, c'est-à-dire au moyen de catégories.

Catégorie :

Il s'agit d'une fonctionnalité au niveau du langage destinée à être une alternative à la sous-classification, c'est-à-dire à l'héritage.

J'espère que cela apportera un peu de lumière sur ce

4voto

Jonathan Sterling Points 11628

Tout ce qu'un protocole informel est est une catégorie sur une certaine classe (souvent NSObject ) qui indique l'interface pour le protocole. AppKit l'utilise beaucoup pour sa délégation.

Une sous-classe que vous écrivez peut mettre en œuvre ces méthodes. La différence entre ce protocole et un protocole formel est que les protocoles formels sont déclarés à l'aide de la balise @protocol ... @end la notation. Il n'est pas possible de vérifier si une classe met en œuvre un protocole informel donné.

J'utilise presque toujours des protocoles formels, mais je suppose qu'un protocole informel est utile si vous voulez fournir un comportement par défaut (il suffit de fournir une implémentation pour votre catégorie qui peut être surchargée).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X