31 votes

Protocole par rapport à la Catégorie

Est-ce que quelqu'un peut expliquer les différences entre Protocoles et Catégories en Objective-C? Quand utilises-tu l'un plutôt que l'autre?

84voto

mipadi Points 135410

Un protocole est la même chose qu'une interface en Java : c'est essentiellement un contrat qui dit, "Toute classe qui implémente ce protocole implémentera également ces méthodes."

En revanche, une catégorie lie simplement des méthodes à une classe. Par exemple, en Cocoa, je peux créer une catégorie pour NSObject qui me permettra d'ajouter des méthodes à la classe NSObject (et, bien sûr, à toutes les sous-classes), même si je n'ai pas vraiment accès à NSObject.

En résumé : un protocole spécifie quelles méthodes une classe implémentera ; une catégorie ajoute des méthodes à une classe existante.

L'utilisation appropriée de chacun devrait donc être claire : Utilisez les protocoles pour déclarer un ensemble de méthodes qu'une classe doit implémenter, et utilisez les catégories pour ajouter des méthodes à une classe existante.

28voto

Alex Points 19842

Un protocole dit : "voici quelques méthodes que j'aimerais que vous implémentiez." Une catégorie dit : "J'étends la fonctionnalité de cette classe avec ces méthodes supplémentaires."

Maintenant, je soupçonne que votre confusion vient de l'utilisation par Apple de l'expression "protocole informel". Voici la clé (et le point le plus confus) : un protocole informel n'est en réalité pas du tout un protocole. C'est en fait une catégorie sur NSObject. Cocoa utilise largement les protocoles informels pour fournir des interfaces aux délégués. Comme la syntaxe @protocol ne permettait pas les méthodes optionnelles jusqu'à Objective-C 2.0, Apple a implémenté des méthodes optionnelles qui ne font rien (ou renvoient une valeur bidon) et des méthodes requises qui génèrent une exception. Il n'y avait aucun moyen de faire respecter cela par le compilateur.

Maintenant, avec Objective-C 2.0, la syntaxe @protocol supporte le mot-clé @optional, marquant certaines méthodes dans un protocole comme optionnelles. Ainsi, votre classe est conforme à un protocole tant qu'elle implémente toutes les méthodes marquées comme @required. Le compilateur peut également déterminer si votre classe implémente toutes les méthodes requises, ce qui est un énorme gain de temps. Le SDK iPhone utilise exclusivement la syntaxe Objective-C 2.0 @protocol, et je ne vois aucune bonne raison de ne pas l'utiliser pour tout nouveau développement (sauf pour les applications Cocoa Mac OS X qui doivent s'exécuter sur des versions antérieures de Mac OS X).

15voto

e.James Points 51680

Catégories:

Une catégorie est une manière d'ajouter de nouvelles méthodes à toutes les instances d'une classe existante sans modifier la classe elle-même.

Vous utilisez une catégorie lorsque vous souhaitez ajouter des fonctionnalités à une classe existante sans en dériver ou réécrire la classe d'origine.

Disons que vous utilisez des objets NSView dans Cocoa, et que vous souhaitez que toutes les instances de NSView puissent effectuer certaines actions. Évidemment, vous ne pouvez pas réécrire la classe NSView, et même si vous en dérivez, toutes les instances de NSView dans votre programme ne seront pas de votre type dérivé. La solution est de créer une catégorie sur NSView, que vous utilisez ensuite dans votre programme. Tant que vous #importez le fichier d'en-tête contenant votre déclaration de catégorie, il semblera que chaque objet NSView réponde aux méthodes que vous avez définies dans le fichier source de la catégorie.

Protocoles:

Un protocole est une collection de méthodes que toute classe peut choisir d'implémenter.

Vous utilisez un protocole lorsque vous voulez garantir qu'une certaine classe répondra à un ensemble spécifique de méthodes. Lorsqu'une classe adopte un protocole, elle promet d'implémenter toutes les méthodes déclarées dans l'en-tête du protocole. Cela signifie que toutes les autres classes utilisant cette classe peuvent être certaines que ces méthodes seront implémentées, sans avoir besoin de connaître autre chose sur la classe.

Cela peut être utile lors de la création d'une famille de classes similaires ayant toutes besoin de communiquer avec une classe "contrôleur" commune. La communication entre la classe contrôleur et les classes contrôlées peut toutes être regroupée dans un seul protocole.

Note: le langage Objective-C ne prend pas en charge l'héritage multiple (une classe ne peut dériver que d'une seule superclasse), mais une grande partie de la même fonctionnalité peut être fournie par les protocoles car une classe peut se conformer à plusieurs protocoles différents.

5voto

PEZ Points 9662

À ma compréhension, les Protocoles sont un peu comme les Interfaces en Java. Les Protocoles déclarent des méthodes, mais l'implémentation est laissée à chaque classe. Les Catégories semblent être quelque chose comme les mixins de Ruby. Avec les Catégories, vous pouvez ajouter des méthodes aux classes existantes. Même aux classes intégrées.

3voto

Nam Points 31

Un protocole vous permet de déclarer une liste de méthodes qui ne sont pas limitées à une classe ou catégorie particulière. Les méthodes déclarées dans le protocole peuvent être adoptées par n'importe quelle classe ou catégorie. Une classe ou catégorie qui adopte un protocole doit implémenter toutes les méthodes requises déclarées dans le protocole.

Une catégorie vous permet d'ajouter des méthodes supplémentaires à une classe existante mais elle ne permet pas d'ajouter des variables d'instance supplémentaires. Les méthodes ajoutées par la catégorie font partie du type de classe.

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