Réponses:
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 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:").
Il peut être intéressant de mentionner que même si Objective-C ne prend pas en charge la surcharge de méthode , Clang + LLVM prend en charge la 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, implémenter 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));
id
et isKindOfClass:
à sa disposition, cependant, est une autre histoire ...
id
et isKindOfClass:
couvre la plupart des scénarios pratiques. Une des raisons pour lesquelles vous préférerez peut-être la surcharge est la sélection automatique du type le plus spécifique pris en charge, ce qui entraînerait une légère surcharge à maintenir avec une vérification de type explicite.
David a raison en ce sens que la surcharge de méthode n'est pas prise en charge dans Objective-C. C'est similaire à PHP dans ce sens. Comme il le souligne également, il est courant de définir deux méthodes ou plus 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 lever l'exception appropriée si nécessaire. Bien que cela ait un impact mineur sur les performances, il sera 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 aussi un bel endroit pour implémenter un protocole pour appliquer le type d'objet, ce qui peut être fait comme ceci:
(id<MyProtocol>)object