Autant que mes connaissances, Objective-C ne supporte pas la surcharge de méthode. Quel peut être l’alternative pour cela en Objective-C ? Ou dois-je toujours utiliser nom de méthode différente ?
Réponses
Trop de publicités?Correcte, objective-C ne supporte pas la surcharge de méthode, donc vous devez utiliser des noms de méthodes différentes.
Notez, cependant, que le nom de « méthode » comprend les mots clés signature de méthode (les noms de paramètres qui viennent avant les « : » s), donc ce qui suit est deux méthodes différentes , même si les deux commencent « writeToFile » :
(les noms des deux méthodes sont « writeToFile:fromInt : » et « writeToFile:fromString : »).
Il peut être utile de mentionner que, même si l'Objective-C ne prend pas en charge la méthode de surcharge, Clang + LLVM prend en charge la fonction de surcharge pour C. Bien que pas tout à fait ce que vous cherchez, il pourrait s'avérer utile dans certaines situations (par exemple, lors de la mise en œuvre un peu piraté (va à l'encontre de l'encapsulation) version du visiteur motif de conception)
Voici un exemple simple sur comment la fonction de surcharge fonctionne:
__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));
David est correct en ce que la surcharge de méthode n'est pas pris en charge en Objective-C. Il est similaire à PHP dans ce sens. Comme il le souligne, il est de pratique courante pour définir deux ou plusieurs méthodes avec des signatures différentes dans la manière qu'il exemples. Cependant, il est également possible de créer une méthode à l'aide de la "id" type. Via le "id" de type, vous pouvez envoyer n'importe quel objet (et de toute primitives à l'aide de la NSNumber classe) pour la méthode, puis à partir de l'intérieur de la méthode elle-même, vous pouvez tester son type et de jeter l'exception appropriée si nécessaire. Bien que cela a un mineur de performances, il sera très probablement être négligeable ou insignifiante, sauf si vous êtes le traitement 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 aussi un bel endroit pour mettre en œuvre un protocole pour faire respecter le type d'objet, ce qui peut être fait comme suit:
(id<MyProtocol>)object