Question

Quelqu'un peut-il expliquer les différences entre Protocoles et Catégories en Objective-C? Quand utilisez-vous un sur l'autre?

Était-ce utile?

La solution

Un protocole est la même chose que d'une interface en Java: il est essentiellement un contrat qui dit, « Toute classe qui implémente ce protocole mettra également en œuvre ces méthodes. »

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

Pour résumer: un protocole spécifie les méthodes d'une classe mettra en œuvre; une catégorie ajoute des méthodes à une classe existante.

L'utilisation appropriée de chacun, alors, devrait être clair: Utiliser des protocoles pour déclarer un ensemble de méthodes qu'une classe doit mettre en œuvre et utiliser des catégories pour ajouter des méthodes à une classe existante

Autres conseils

Un protocole dit « voici quelques méthodes que je voudrais à mettre en œuvre. » Une catégorie dit: « Je suis l'extension de la fonctionnalité de cette classe avec ces méthodes supplémentaires. »

Maintenant, je soupçonne que votre confusion provient de l'utilisation d'Apple de l'expression « protocole informel ». Voici la clé (et la plus déroutante) le point: un protocole informel est en fait pas un protocole du tout. Il est en fait une catégorie sur NSObject. Cocoa utilise des protocoles informels pervasively pour fournir des interfaces pour les délégués. Étant donné que la syntaxe ne permettait pas aux @protocol méthodes optionnelles jusqu'à ce que Objective-C 2.0, Apple a mis en œuvre des méthodes en option de ne rien faire (ou retourner une valeur factice) et les méthodes nécessaires pour lancer une exception. Il n'y avait pas moyen de faire respecter ce par le compilateur.

Maintenant, avec Objective-C 2.0, la syntaxe @optional prend en charge le mot-clé @required, certaines méthodes de marquage dans un protocole en option. Ainsi, votre classe est conforme à un protocole tant qu'il implémente toutes les méthodes définies comme <=>. Le compilateur peut déterminer si votre classe implémente toutes les méthodes nécessaires, aussi, ce qui est un gain de temps énorme. L'iPhone SDK utilise exclusivement l'Objective-C 2.0 syntaxe <=>, et je ne peux pas penser à une bonne raison de ne pas l'utiliser dans tout nouveau développement (sauf pour les applications Mac OS X Cocoa qui ont besoin de fonctionner sur les versions antérieures de Mac OS X).

Catégories:

Une catégorie est un moyen 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 tirer de cette classe ou réécrivant la classe d'origine.

Disons que vous utilisez des objets dans le cacao NSView, et vous vous retrouvez en souhaitant que toutes les instances de ont pu #import effectuer une action. De toute évidence, vous ne pouvez pas réécrire la classe <=>, et même si vous en tirer, pas tous les objets dans votre programme <=> sera de votre type dérivé. La solution est de créer une catégorie sur <=>, que vous utilisez ensuite dans votre programme. Tant que vous le fichier <=> tête contenant votre déclaration de catégorie, il apparaît comme si tous objet répond aux <=> les méthodes que vous avez définies dans le fichier source catagory.

Protocoles:

Un protocole est un ensemble de méthodes que toute classe peut choisir de mettre en œuvre.

Vous utilisez un protocole lorsque vous souhaitez fournir une garantie qu'une certaine classe répondra à un ensemble spécifique de méthodes. Lorsqu'une classe adopte un protocole, il promet de mettre en œuvre toutes les méthodes déclarées dans l'en-tête de protocole. Cela signifie que toutes les autres classes qui utilisent cette classe peut être certain que ces méthodes seront mises en œuvre, sans avoir besoin de connaître anyting autre de la classe.

Cela peut être utile lors de la création d'une famille de classes similaires qui ont tous besoin de communiquer avec une classe « contrôleur » commun. La communication entre le contrôleur de classe et les classes contrôlées peuvent tous être emballés dans un seul protocole.

Side note: la langue objective-c ne supporte pas l'héritage multiple (une classe ne peut tirer d'une superclasse), mais une grande partie de la même fonctionnalité peut être fournie par des protocoles, car une classe peut se conformer à plusieurs protocoles différents

Pour mes protocoles de compréhension sont un peu comme les interfaces de Java. Protocoles déclarent méthodes, mais la mise en œuvre est à chaque classe. Catégories semble être quelque chose comme les mixins de Ruby. Avec catégories, vous pouvez ajouter des méthodes aux classes existantes. Même classes intégrées.

Un protocole vous permet de déclarer une liste des méthodes qui ne se limitent pas à une classe particulière ou catégories. Les méthodes déclarées dans le protocole peuvent adopter toutes les classes / catégories. Une classe ou d'une catégorie qui adopte un protocole doit en œuvre toutes les méthodes nécessaires déclarées dans le protocole.

Une catégorie vous permet d'ajouter des méthodes à une classe existante, mais ils ne permettent pas des variables d'instance supplémentaires. Les méthodes de la catégorie AJOUTE font partie du type de classe.

Protocoles sont des contrats pour mettre en œuvre les méthodes spécifiées. Tout objet qui est conforme à un protocole d'accord pour fournir des implémentations de ces méthodes. Une bonne utilisation d'un protocole serait de définir un ensemble de méthodes de rappel pour un délégué (où le délégué doit répondre à toutes les méthodes).

Catégories offrent la possibilité de prolonger un objet actuel en ajoutant des méthodes pour le (les méthodes de classe ou d'instance). Un bon usage pour une catégorie serait l'extension de la classe NSString pour ajouter des fonctionnalités qui ne existait pas auparavant, comme l'ajout d'une méthode pour créer une nouvelle chaîne qui convertit le récepteur en 1337 5P34K.

NSString *test = @"Leet speak";
NSString *leet = [test stringByConvertingToLeet];

Définitions de la "programmation en Objective-C" de S.G.Kochan:

Catégories:

Une catégorie est un moyen facile pour vous de modulariser la définition d'une classe en groupes ou catégories de méthodes connexes. Il vous donne également un moyen facile d'étendre une définition de classe existante sans même avoir accès au code source d'origine pour la classe et sans avoir à créer une sous-classe.

Protocoles:

Un protocole est une liste des méthodes qui est partagée entre les classes. Les méthodes énumérées dans le protocole ne sont pas mises en œuvre correspondantes; ils sont destinés à être mis en œuvre par quelqu'un d'autre (comme vous!). Un protocole fournit un moyen pour définir un ensemble de méthodes qui sont liées d'une certaine manière avec un nom spécifié. Les méthodes sont généralement documentées de sorte que vous savez comment ils sont à réaliser et pour que vous puissiez les mettre en œuvre dans vos propres définitions de classe, si on le souhaite. Une liste de protocole un ensemble de méthodes, dont certaines vous pouvez mettre en œuvre le cas échéant, et d'autres que vous êtes tenus de mettre en œuvre. Si vous décidez de mettre en œuvre toutes les méthodes nécessaires pour un protocole particulier, vous dit de se conformer ou d'adopter ce protocole. Vous êtes autorisé à définir un protocole où toutes les méthodes sont facultatives, ou celui où tous sont nécessaires.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top