9 votes

Objective C - Catégories et héritage - Ajouter une méthode à la classe de base et ajouter une surcharge à la classe dérivée

Je sais que les catégories ne doivent pas être utilisées pour surcharger une méthode de la classe qu'elles étendent. Cependant, qu'en est-il du scénario suivant.

Considérez les classes :

Base.h

#import <Foundation/NSObject.h>

@interface Base: NSObject { NSNumber *n; }
@end

Derived.h

#import "Base.h"

@interface Derived: Base { NSString *s; }
@end

Avec des catégories :

Base+Serialize.h

#import "Base.h"

@interface Base (Serialize)
- (NSString*)serialize;
@end

Base+Serialize.m

#import "Base+Serialize.h"

@implementation Base (Serialize)
- (NSString*)serialize
{
    return [NSString stringWithFormat:@"%@", n];
}

@end

Dérivé+Serialize.h

#import "Derived.h"

#import "Base+Serialize.h"

@interface Derived (Serialize)
- (NSString*)serialize;
@end

Dérivé+Serialize.m

#import "Derived+Serialize.h"

@implementation Derived (Serialize)
- (NSString*)serialize
{
    return [NSString stringWithFormat:@"%@, %@", s, [super serialize]];
}

@end

Il s'agit évidemment d'un exemple artificiel/simplifié. Mais il fonctionne bien pour démontrer ce que je voudrais faire. Essentiellement, je veux fournir une fonctionnalité supplémentaire à plusieurs classes dans une hiérarchie d'héritage.

S'agit-il d'une utilisation sûre/valide des catégories ? Des problèmes ?

1voto

picciano Points 5638

Cela ne semble pas être un très bon modèle d'objet. Base.h et Derived.h semblent bien. Pourquoi ne pas créer un protocole pour définir la méthode serialize :, plutôt qu'une catégorie ? Ce serait un peu plus propre. Base.h indiquerait qu'il mettrait en œuvre le protocole et Derived pourrait remplacer la méthode si nécessaire.

1voto

David V Points 4950

C'est une façon acceptable d'utiliser les catégories. Les catégories ajoutent effectivement le message à la classe, de sorte que le message fonctionnera comme n'importe quel autre message. Cela inclut l'héritage.

Une chose à laquelle il faut peut-être faire attention est que vous pouvez rencontrer des collisions de noms. Je ne sais pas comment le runtime les gère, mais si deux catégories fournissent le même message, vous pouvez avoir un comportement inattendu puisque le message que vous attendez n'est pas appelé. Ceci étant dit, il se peut que vous souhaitiez simplement un nom qui soit un peu plus distinctif que serialize sauf, bien sûr, si vous avez besoin de ce nom (par exemple, si vous avez un protocole informel).

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