129 votes

Surcharge de méthode en Objective-C?

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 ?

190voto

David Gelhar Points 20703

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 : »).

22voto

Valentin Radu Points 4553

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));

19voto

Ziminji Points 750

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

1voto

Thomas Müller Points 7712

Oui, je pense que vous devrez toujours utilisent des noms différents.

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