Différence entre catégorie et extension de classe?

85

Quelle est la différence entre une catégorie et une extension de classe. Je crois que les deux sont utilisés pour ajouter des méthodes personnalisées dans les classes existantes. Quelqu'un peut-il faire la lumière là-dessus? L'examen avec le code sera vraiment apprécié.

Abhinav
la source
3
Akusete, la page est introuvable.
Adil Hussain
clairement illustré ici, code.tutsplus.com/tutorials/…
grassyburrito

Réponses:

103

Une catégorie est un moyen d'ajouter des méthodes à des classes existantes. Ils résident généralement dans des fichiers appelés "Class + CategoryName.h", comme "NSView + CustomAdditions.h" (et .m, bien sûr).

Une extension de classe est une catégorie, à l'exception de 2 différences principales:

  1. La catégorie n'a pas de nom. Il est déclaré comme ceci:

    @interface SomeClass ()
    
    
    - (void) anAdditionalMethod;
    
    @fin
  2. L'implémentation de l'extension doit être dans le bloc @implementation principal du fichier.

Il est assez courant de voir une extension de classe en haut d'un fichier .m déclarant plus de méthodes sur la classe, qui sont ensuite implémentées ci-dessous dans la section principale @implementation de la classe. C'est une façon de déclarer des méthodes "pseudo-privées" (pseudo-privées en ce qu'elles ne sont pas vraiment privées, mais pas exposées de l'extérieur).

Dave DeLong
la source
13
Dans Class-Extensiosn, vous pouvez remplacer les propriétés d'une propriété en lecture seule (publique) pour qu'elles soient en lecture-écriture en interne. Et depuis LLVM 1.5, vous pouvez faire encore plus: vous pouvez maintenant déclarer des variables d'instance dans une extension de classe afin qu'elles soient sorties de l'interface normale.
Max Seelemann
Pourquoi ajouter une extension de classe alors que vous pouvez simplement implémenter ces méthodes et propriétés dans la classe? Cela me semble un peu redondant.
user1721803
1
@ user1721803 Comme Dave l'a suggéré, vous voudrez peut-être garder quelques propriétés / méthodes non exposées. C'est à ce moment que les extensions sont utilisées. Considérez une vue, vous pouvez connecter tous vos IBOutlets et IBActions en extension et exposer des méthodes qui permettent d'initialiser / mettre à jour les Outlets et les actions pourraient être déléguées.
GoodSp33d
@MaxSeelemann pouvez-vous s'il vous plaît démo comment faire "une propriété (publique) en lecture seule à lire en interne" par un court script? Merci.
allenlinli
Cette réponse indique l'extension dans le fichier "Class + CategoryName.swift", est-ce correct?
Rishi
47
  1. Catégorie

=> En Objective C, lorsque vous souhaitez ajouter plus de fonctionnalités à une classe sans héritage, vous utilisez simplement la catégorie pour cela.

=> il est livré avec ses propres fichiers .h et .m

=> Categoryutilise pour ajouter une nouvelle méthode et non des propriétés.

  1. Extension de classe
-> In Objective C, when you want to make behaviour of some property private you use class extension.

-> it comes with **.h** file only.

-> mainly for properties.

Remarque: lorsque nous ajoutons un nouveau fichier et sélectionnons une option de l'objectif c, la catégorie affiche la catégorie et la "catégorie sur" et non la "sous-classe de", donc cela montre comme

@interface className (categoryName)
@end

-Vous obtiendrez deux fichiers .h et .m avec le nom de fichier comme ( className + categoryName.h et className + categoryName.m )

et en cas d'extension, vous obtiendrez

@interface className()
@end

-Vous n'obtiendrez qu'un seul fichier avec le nom className_extensionName.h

  • Dans la catégorie vous ne possédez pas la classe mais en extension vous l'êtes.
Anurag Bhakuni
la source
5
@Prasanna: l'extension de classe est livrée avec le fichier .m uniquement et pas en .h
Saggy
1
l'extension de classe est fournie avec un fichier .h uniquement et non avec un .m
Nishu_Priya
32
  1. La catégorie est un moyen d'ajouter des méthodes à une classe, que le code source soit disponible ou non, ce qui signifie que vous pouvez ajouter une catégorie à des classes de base comme NSStringet à vos propres classes personnalisées.

    L'extension ne peut être ajoutée qu'aux classes dont le code source est disponible car le compilateur compile le code source et l'extension en même temps.

  2. Nous pouvons ajouter des variables d'instance et des propriétés supplémentaires dans l'extension de classe mais pas dans la catégorie.

  3. Les variables et méthodes à l'intérieur de l'extension ne sont même pas accessibles aux classes héritées.

  4. La catégorie et l'extension sont toutes deux conçues pour gérer une base de code volumineuse, mais la catégorie est un moyen d'étendre l'API de classe dans plusieurs fichiers source, tandis que l'extension est un moyen d'ajouter les méthodes requises en dehors du fichier d'interface principal.

  5. Utilisez la catégorie lorsque vous devez diviser votre même code de classe en différents fichiers source en fonction de différentes fonctionnalités, et l'extension lorsque vous avez juste besoin d'ajouter certaines méthodes requises à la classe existante en dehors du fichier d'interface principal. De plus, lorsque vous devez modifier une variable d'instance déclarée publiquement dans une classe, par exemple, en lecture seule pour readwrite, vous pouvez la re-déclarer dans l'extension.

Venu Gopal Tewari
la source
3
J'ai lu 5 questions similaires avec de nombreuses réponses, et c'est la meilleure. Merci!
Honey
1
Vous pouvez également ajouter des propriétés dans la catégorie. Voir la réponse @Pebby.
atulkhatri
7

Extension : Pour rendre les méthodes privées et pour ajouter des propriétés de notre propre classe personnalisée, pas de la classe Apple.

Catégorie : pour ajouter plus de méthodes dans la classe existante et non dans la propriété, elle peut être utilisée à la fois pour la classe personnalisée et la classe Apple comme NSString.

Garg Ankit
la source
Simple et élégant. Continuez comme ça
Abdul Yasin
3

Nous pouvons également avoir des propriétés en utilisant la propriété associée set dans la classe de catégorie.

@interface SomeClass (Private)

@property (nonatomic, assign) id newProperty;

@end

NSString * const kNewPropertyKey = @"kNewPropertyKey";

@implementation SomeClass (Private)

@dynamic newProperty;

- (void)setNewProperty:(id)aObject
{
    objc_setAssociatedObject(self, kNewPropertyKey, aObject, OBJC_ASSOCIATION_ASSIGN);
}

- (id)newProperty
{
    return objc_getAssociatedObject(self, kNewPropertyKey);
}

@end

Reportez-vous: http://inchoo.net/dev-talk/ios-development/how-to-add-a-property-via-class-category/

PradeepKN
la source
2
@interface SomeClass ()


- (void) anAdditionalMethod;


@end

Je pense que ce n'est pas la manière de déclarer la catégorie. La catégorie doit avoir un nom

@interface SomeClass (XYZ)


- (void) anAdditionalMethod;


@end

par exemple

@interface NSMutableArray (NSMutableArrayCreation)

+ (id)arrayWithCapacity:(NSUInteger)numItems;
- (id)initWithCapacity:(NSUInteger)numItems;

@end

Déclaré pour NSMutableArray par Apple

Explorant
la source
C'est ainsi que vous déclarez et l'extension, pas une catégorie -> @interface SomeClass ()
ChavirA
0

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

Ajouter080bbA
la source
4
votre réponse tout comme "le chat est semblable au tigre, répondant à un aveugle". Lol
Muruganandham K
1
ce n'est pas réellement. C'est l'explication la plus directe et la plus rapide si vous connaissez c # ou java.
Add080bbA
Pas très descriptif du tout, et a à peine répondu à la question.
KVISH
0

Catégories

Les catégories sont utilisées lorsque vous créez un fichier contenant un grand nombre de méthodes, elles vous permettent donc de diviser une seule classe en différents modules.De plus, si des modifications sont apportées aux catégories, le compilateur ne perd pas de temps à compiler l'ensemble du projet .Les catégories ne peuvent pas ajouter de nouvelles variables ou propriétés et regarder jusqu'à leur classe parente. Vous pouvez remplacer une méthode dans une catégorie, mais ce n'est pas une bonne idée car la méthode ne peut pas être remplacée. De plus, le flux peut être effectué car toutes les catégories ont le même niveau hiérarchique et par conséquent deux catégories appartenant à la même classe parente peuvent exister au moment de l'exécution.

Extensions

Les extensions vous permettent de remplacer la propriété ou d'ajouter une nouvelle propriété à la classe parente existante.Syntatiquement identiques aux catégories, elles n'ont pas de nom et sont représentées comme @interface class () Aucun fichier .m n'est présent et la méthode déclarée en extension doit être implémentée dans @implémentation du fichier parent

Plus d'aide sur ce lien

Suryanarayan Sahu
la source
0

Voici ma compréhension:

Les extensions sont généralement utilisées pour ajouter des fonctionnalités supplémentaires à notre propre « classe personnalisée ». Nous pouvons ajouter des méthodes privées ou des propriétés étendant l'interface de classe qui peuvent être utilisées dans l'implémentation de la classe.

Les extensions doivent être écrites dans le même fichier que la classe. Par conséquent, vous ne pouvez pas écrire d'extensions pour des types prédéfinis tels que String, Float, etc.

D'autre part, les catégories peuvent être utilisées pour ajouter des méthodes supplémentaires à des classes préexistantes. Exemple, nous pouvons créer nos propres méthodes en étendant la classe String. Notez que nous ne pouvons pas créer de propriétés supplémentaires dans les catégories. Le principal avantage des catégories est également que nous pouvons écrire les catégories dans n'importe quel autre fichier, en dehors du fichier où votre classe se termine.

De plus, lors de la création de catégories, vous êtes censé lui donner un nom entre crochets. Mais pour l'extension, aucun nom n'est requis. Par conséquent, parfois, elles sont également appelées catégories anonymes.

iPhoneDéveloppeur
la source
Vous êtes un peu sur la bonne voie.
Abdul Yasin
@iPhoneDeveloper Nous pouvons écrire l'extension pour les types prédéfinis. Veuillez vérifier ce lien - stackoverflow.com/a/33942484/2060508
yo2bh