web-dev-qa-db-fra.com

Surcharge de méthode dans Objective-C?

À ma connaissance, Objective-C ne prend pas en charge la surcharge de méthode. Quelle peut être l'alternative à cela dans Objective-C? Ou dois-je toujours utiliser un nom de méthode différent?

127
suse

Correct, objective-C ne prend pas en charge la surcharge de méthode, vous devez donc utiliser des noms de méthode différents.

Notez, cependant, que le "nom de la méthode" inclut les mots-clés de signature de la méthode (les noms de paramètres qui précèdent les ":"), donc ce qui suit sont deux méthodes différentes, même si elles commencent toutes les deux " writeToFile ":

-(void) writeToFile:(NSString *)path fromInt:(int)anInt;
-(void) writeToFile:(NSString *)path fromString:(NSString *)aString;

(les noms des deux méthodes sont "writeToFile: fromInt:" et "writeToFile: fromString:").

186
David Gelhar

Il peut être utile de mentionner que même si Objective-C ne prend pas en charge la surcharge , Clang + LLVM prend en charge surcharge de fonction pour C. Bien que ce ne soit pas tout à fait ce que vous recherchez, cela pourrait s'avérer utile dans certaines situations (par exemple, lors de l'implémentation de une version légèrement piratée (va à l'encontre de l'encapsulation) du modèle de conception visiteur )

Voici un exemple simple sur le fonctionnement de la surcharge de fonctions:

__attribute__((overloadable)) float area(Circle * this)
{
    return M_PI*this.radius*this.radius;
}

__attribute__((overloadable)) float area(Rectangle * this)
{
    return this.w*this.h;
}

//...
//In your Obj-C methods you can call:
NSLog(@"%f %f", area(rect), area(circle));
22
Valentin Radu

David a raison dans le fait que la surcharge de méthode n'est pas prise en charge dans Objective-C. Il est similaire à PHP dans ce sens. Comme il le fait également remarquer, il est courant de définir deux ou plusieurs méthodes avec des signatures différentes de la manière dont il donne des exemples. Cependant, il est également possible de créer une méthode en utilisant le type "id". Via le type "id", vous pouvez envoyer n'importe quel objet (et toutes les primitives utilisant la classe NSNumber) à la méthode, puis à partir de la méthode elle-même, vous pouvez tester son type et lancer le type approprié exception si nécessaire. Bien que cela ait un impact mineur sur les performances, il sera très probablement nominal ou insignifiant, sauf si vous traitez de grandes quantités de données.

- (void) writeToFile: (NSString *)path fromObject: (id)object {
    if (!([object isKindOfClass: [NSNumber class]] || [object isKindOfClass: [NSString class]])) {
         @throw [NSException exceptionWithName: @"InvalidArgumentException" reason: @"Unrecognized parameter type." userInfo: nil];
    }
}

C'est également un bel endroit pour implémenter un protocole pour appliquer le type d'objet, ce qui peut être fait comme suit:

(id<MyProtocol>)object
19
Ziminji