Ist das Überladen von Funktionen in Objective C möglich?

7

Ist das Überladen von Funktionen in Ziel C möglich?
Nun, die meisten Programmierer sagen nein,
Aber es sieht möglich aus, zum Beispiel:

%Vor%

um den ersten zu nennen, schreiben Sie [self AddMethod :3];
den letzten Schreibvorgang [self AddMethod: 3 :4];

aufrufen     
Matrix 08.09.2010, 09:08
quelle

7 Antworten

22

In Objective-C ist eine Methodenüberladung nicht möglich. Ihr Beispiel funktioniert jedoch, weil Sie zwei verschiedene Methoden mit verschiedenen Selektoren erstellt haben: -AddMethod:: und AddMethod: . Für jeden verschachtelten Parameter gibt es einen Doppelpunkt. Es ist normal, einen Text auch z. -addMethodX:Y: , aber du musst nicht.

    
JeremyP 08.09.2010, 09:32
quelle
4

Nein, das ist meistens nicht der Fall, weil Objective-C keine Funktionen verwendet, sondern Methoden.

Überladen der Methode andererseits ist möglich . Irgendwie.

Betrachten Sie, wenn Sie so wollen, eine Klasse mit einer Methode ein Argument in der Form von entweder NSString * oder const char * :

%Vor%

Während die Methode selbst nicht um die Auswahl der richtigen Methode mit einer gegebenen Eingabe gehen wird; man könnte immer noch sagen, dass doThing: überladen ist, zumindest in dem Sinne, dass die beiden Methoden einen anderen Parameter verwenden, um dieselbe Funktionalität zu erreichen.

    
Williham Totland 08.09.2010 09:09
quelle
2

Technisch ist das Überladen von Methoden in Objective-C nicht möglich. In der Praxis können Sie normalerweise die gleichen Ergebnisse erzielen, auch in Fällen, in denen Sie nicht in C ++ arbeiten konnten. In Objective-C enthalten Methodennamen einen Doppelpunkt vor jedem Argument und die Doppelpunkte sind TEIL DER METHODENNAME, was bedeutet, dass Ihr Beispiel verschiedene Methodennamen verwendet. In der Praxis wird dies zu einer Art Pseudo-Named-Parameter-Funktionalität, und Sie können eine Pseudo-Methode über das Argument FUNCTION anstatt über das Argument TYPE überladen. In den meisten Fällen wird dies tatsächlich nützlicher sein, aber es ist keine Überladung der Methode im engeren Sinne, weil die Methodennamen anders sind.

Beispiel:

%Vor%

Dies würde in Objective-C funktionieren, aber Sie könnten keine ähnliche Funktionalität in C ++ bekommen, weil die Argumentnummer und die Typen identisch sind, nur die Argumentfunktionen unterschiedlich sind. In einigen wenigen Fällen kann das C ++ Modell nützlichere Funktionen erreichen. Dies wird durch die NSKeyedArchiver-Klasse demonstriert:

%Vor%

Hier mussten sie Argumenttypen Teil des moethod Namen machen, der hässlich ist. Wenn ich zwischen C ++ Überladung und Objective-C "Überladung" wählen könnte, würde ich immer noch die letztere wählen.

    
Balthazar 18.03.2011 20:24
quelle
2

Sie könnten mit einer generischen Methode beginnen, die basierend auf dem Typ des übergebenen Objekts routet.

%Vor%

Dann können Sie den Typ überprüfen, um zu sehen, ob es NSData oder UIImage ist, und es intern zu den entsprechenden Methoden routen.

%Vor%

Sie können auch auswählen, dass nur erwartete Typen unterstützt werden, und ablehnen, nicht unterstützte Typen zu verarbeiten oder explizit fehlschlagen.

Schlagen Sie NSAsssert1, NSAssert2 usw. nach einem anderen Ansatz auf.

    
Brennan 03.05.2011 23:22
quelle
0

Beachten Sie, dass es möglich ist, Funktionen zu überladen, wenn Objective-C mit C ++ kombiniert wird. Ich erwähne das nur, weil du deine .m-Datei in XCode in eine .mm-Datei umwandeln musst, um sie so zu behandeln, was mich ein paar Minuten lang stolperte.

Beispiel Kopfzeile:

%Vor%

Wenn Sie dies in eine .m-Datei aufnehmen, erhalten Sie eine Warnung:

  

Widersprüchliche Typen für 'addMethod'

Durch das Ändern Ihrer .m-Datei in eine .mm-Datei wird das Problem behoben.

    
Ben Flynn 19.10.2012 03:00
quelle
0

Sie können C-Funktionen mit neueren Compilern überladen - Syntax ist zwar ein wenig klobig (nichts, was eine schnelle #define nicht beheben kann), aber es funktioniert gut.

Überladen der Funktion in C

    
Steazy 01.11.2013 16:57
quelle
-1

Categories bieten eine weitere Möglichkeit, das Überladen von c-style-Methoden in Objective C zu emulieren. Betrachten Sie als Beispiel die folgenden Schnittstellendeklarationen:

%Vor%

Die verschiedenen Parametertypen werden durch die Kategorien aufgelöst.

    
trotsky 03.05.2011 19:04
quelle

Tags und Links