2010-02-18 14 views
118

Soweit ich weiß, unterstützt Objective-C keine Methodenüberladung. Was kann dafür in Objective-C die Alternative sein? Oder sollte ich immer einen anderen Methodennamen verwenden?Methode überladen in Objective-C?

Antwort

174

Korrekt, objective-C unterstützt keine Überladung von Methoden, daher müssen Sie verschiedene Methodennamen verwenden.

Beachten Sie jedoch, dass der „Methodenname“ enthält die Methodensignatur Schlüsselwörter (die Parameter Namen, die vor dem kommen „:“ s), so dass die folgenden zwei verschiedenen Methoden, obwohl sie beide beginnen " writeToFile ":

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

(die Namen der beiden Methoden sind "writeToFile: fromInt:" und "writeToFile: vonString:").

+2

@RaheelSadiq Es ist nicht, weil die Methodennamen (In ObjC Überlastung: ‚Wähler‘) unterschiedlich sind. Anders zu sein, wird keiner als "überladen" betrachtet. Wenn writeToFile: from: doppelt definiert wäre und nur der Parameter * types * anders wäre, würde das überladen. Wie bereits erwähnt, wird dies in ObjC nicht wie bei anderen Sprachen wie Java und jetzt Swift unterstützt. –

+0

Nicht nur die Parameternamen selbst, sondern sogar die Doppelpunkte sind Teil des Methodennamens, so dass - (void) writeToFile: (NSString *) path: (int) anInt; und - (void) writeToFile: (NSString *) Pfad: (NSString *) aString, sind auch verschiedene Methoden. – Kaiserludi

19

David ist korrekt in dieser Methode Überladung wird in Objective-C nicht unterstützt. Es ist ähnlich wie PHP in diesem Sinne. Wie er auch ausführt, ist es üblich, zwei oder mehr Methoden mit unterschiedlichen Signaturen in der Art und Weise zu definieren, wie er es nennt. Es ist jedoch auch möglich, eine Methode mit dem Typ "id" zu erstellen. Über den Typ "id" können Sie ein beliebiges Objekt (und alle Primitive, die die NSNumber-Klasse verwenden) an die Methode senden. Anschließend können Sie innerhalb der Methode selbst den Typ testen und bei Bedarf die entsprechende Ausnahme auslösen. Obwohl dies einen geringen Leistungseinbruch hat, wird es höchstwahrscheinlich nominal oder unbedeutend sein, es sei denn, Sie verarbeiten große Datenmengen.

- (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]; 
    } 
} 

Dies ist auch ein schöner Ort, um ein Protokoll zu implementieren den Objekttyp zu erzwingen, die wie so getan werden kann:

(id<MyProtocol>)object 
22

Es kann sich lohnen, dass, selbst wenn Objective-C zu erwähnen doesn‘ t Unterstützung Überladung, Clang + LLVM unterstützt Funktion Überlastung für C. Obwohl nicht ganz das, was Sie suchen, könnte es in einigen Situationen nützlich sein (zum Beispiel, wenn ein leicht gehackt (gegen Kapselung)) Version des visitor design pattern)

Hier ist ein einfaches Beispiel, wie Funktion Überlastung Werke:

__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)); 
+0

Man könnte meinen, dass dieser Hinweis, kombiniert mit der Methode swizzling, tatsächlich zu "übersteuerbaren" Methoden führen könnte ... Warum man mit 'id' und' isKindOfClass: 'auf der Hand sein sollte, ist _eine andere Geschichte_. .. –

+1

@alexgray Ich sehe Ihren Punkt, id und isKindOfClass: decken die meisten praktischen Szenarien. Ein Grund, warum Sie das Überladen bevorzugen, ist die automatische Auswahl des spezifischsten Typs, für den gesorgt wird, was einen geringen Overhead mit der expliziten Typprüfung mit sich bringen würde. –

+1

Die Clang-Dokumentation besagt explizit, dass das, was sie tut, den C++ - Namen darstellt, der für C fehlt.Und das ist im Grunde nur der Compiler, der automatisch hinter den Kulissen vorgeht, was man in Objective-C tut, indem er Methodennamen gibt, die dadurch verschieden sind, dass er (in längerer Form) die Argumenttypen umfasst. –