81 votes

Extension de classe vs catégorie de classe

Extensions de classe @interface Class () sont beaucoup plus puissants et peuvent injecter des variables dans la classe. Catégories @interface Class (Category) ne peut pas.

Quelles sont les autres différences, et quand faut-il utiliser une catégorie plutôt qu'une extension de classe ?

89voto

jtbandes Points 39804

La principale différence est qu'avec une extension, le compilateur s'attendra à ce que vous implémentiez les méthodes dans votre fichier principal. @implementation alors qu'avec une catégorie, vous avez un @implementation bloc. Vous ne devriez donc utiliser une extension qu'au sommet de votre bloc principal. .m (le seul endroit où vous devriez vous préoccuper des ivars, d'ailleurs) -- il est censé n'être que cela, un fichier extension .

30voto

John Doe Points 473

Une extension de classe présente certaines similitudes avec une catégorie, mais elle ne peut être ajoutée qu'à une classe dont vous avez le code source au moment de la compilation (la classe est compilée en même temps que l'extension de classe). Les méthodes déclarées par une extension de classe sont implémentées dans le bloc @implementation de la classe d'origine. Vous ne pouvez donc pas, par exemple, déclarer une extension de classe sur une classe de framework, telle qu'une classe Cocoa ou Cocoa Touch comme NSString.

La syntaxe pour déclarer une extension de classe est similaire à la syntaxe pour une catégorie, et ressemble à ceci :

@interface ClassName ()
@end

Comme aucun nom n'est donné entre parenthèses, les extensions de classe sont souvent appelées catégories anonymes.

Contrairement aux catégories ordinaires, une extension de classe peut ajouter ses propres propriétés et variables d'instance à une classe. Si vous déclarez une propriété dans une extension de classe, comme ceci :

@interface XYZAnimal () {
    id _someCustomInstanceVariable;
}
...
@end

À mon avis, il est préférable de considérer les extensions de classe comme des interfaces privées d'une classe. L'interface primaire (dans votre fichier .h) agit comme l'interface publique qui définit le contrat comportemental de la classe avec les autres classes.

Utiliser les extensions de classe pour cacher des informations privées

Les extensions de classe sont souvent utilisées pour étendre l'interface publique avec des méthodes ou des propriétés privées supplémentaires à utiliser dans l'implémentation de la classe elle-même. Il est courant, par exemple, de définir une propriété comme readonly dans l'interface, mais comme readwrite dans une extension de classe déclarée au-dessus de l'implémentation, afin que les méthodes internes de la classe puissent modifier la valeur de la propriété directement.

Par exemple, la classe XYZPerson pourrait ajouter une propriété appelée uniqueIdentifier, conçue pour conserver la trace d'informations telles que le numéro de sécurité sociale aux États-Unis.

L'attribution d'un identifiant unique à un individu dans le monde réel nécessite généralement beaucoup de travail administratif. L'interface de la classe XYZPerson pourrait donc déclarer cette propriété comme étant en lecture seule et fournir une méthode permettant de demander l'attribution d'un identifiant, comme ceci :

@interface XYZPerson : NSObject
    ...
    @property (readonly) NSString *uniqueIdentifier;
    - (void)assignUniqueIdentifier;
@end

Pour que la classe XYZPerson puisse modifier la propriété en interne, il est logique de redéclarer la propriété dans une extension de classe définie en haut du fichier d'implémentation de la classe :

@property (readwrite) NSString *uniqueIdentifier;

Remarque : L'attribut readwrite est facultatif, car il s'agit de la valeur par défaut. Vous pouvez l'utiliser lorsque vous redéclarez une propriété, pour plus de clarté.

7voto

Julie Yu Points 83

Les catégories sont une fonctionnalité du langage Objective-C qui permet d'ajouter de nouvelles méthodes à une classe existante. Les extensions sont un cas particulier de catégories qui vous permettent de définir des méthodes qui doivent être implémentées dans le bloc d'implémentation principal.

Les déclarations privées peuvent se trouver dans les extensions de classe, qui sont principalement certaines propriétés, car nous n'avons pas besoin de déclarer une méthode avant de l'appeler.

0voto

Add080bbA Points 127

Extension ios similaire à une classe ou interface abstraite c#, java
catégorie ios similaire à l'extension de classe c#

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