Ist das überladen von Funktionen möglich, die in Objective C?
Ist das überladen von Funktionen möglich, die in Objective C ?
Nun,die Meisten der Programmierer sagt, Nein,
Aber es sieht aus wie möglich,
Beispiel:
-(int)AddMethod:(int)X :(int)Y
{
return X + Y;
}
-(int)AddMethod:(int)X
{
return X;
}
aufrufen 1. ein schreiben [self AddMethod :3];
zu nennen Letzte schreiben [self AddMethod: 3 :4];
- ich habe mal gelesen, dass viele Programmierer sagen, dass das überladen von Funktionen ist nicht möglich, in objective C.
- Bin ich im Recht ? ....
- Diese ist nicht überladen, Ihre Methoden haben unterschiedliche Selektoren (=Namen). Man ist
AddMethod:
und der andere istAddMethod::
Du musst angemeldet sein, um einen Kommentar abzugeben.
Methode überladen ist nicht möglich in Objective-C. Allerdings ist dein Beispiel tatsächlich funktionieren wird, weil Sie geschaffen haben zwei verschiedenen Methoden mit verschiedenen Selektoren:
-AddMethod::
undAddMethod:
. Es ist ein Doppelpunkt für jeden interleaved parameter. Es ist normal, einige text in z.B. auch-addMethodX:Y:
aber Sie müssen nicht.Nein, es ist nicht, vor allem, da Objective-C keine Funktionen verwenden, es nutzt Methoden.
Methode überladen, auf der anderen Seite ist möglich. Art.
Denken, wenn man so will, eine Klasse mit einer Methode, die ein argument auf die form von entweder einem
NSString *
oder eineconst char *
:Während die Methode selbst nicht gehen, um die Wahl der richtigen Methode, mit einem gegebenen input; könnte man noch sagen, dass
doThing:
überlastet war, zumindest nicht in dem Sinne, dass die beiden Methoden, wobei verschiedene parameter zur Erreichung der gleichen Funktionalität.Technisch gesehen ist die Methode überladen ist nicht möglich in Objective-C. In der Praxis können Sie in der Regel die gleichen Ergebnisse erzielen, auch in Fällen, in denen konnte man nicht in C++. In Objective-C, Methode Namen enthalten einen Doppelpunkt vor jedem argument, und die Doppelpunkte sind TEIL DES NAMENS DER METHODE, was bedeutet, dass Ihr Beispiel wird andere Methode Namen. In der Praxis wird eine Art pseudo-named-Parameter-Funktionalität, und Sie können eine pseudo-Methode überladen von argument-FUNKTION eher als argument GEBEN. In den meisten Fällen wird dies tatsächlich nützlicher sein, aber es ist nicht die Methode überladen im strengen Sinn, weil die Methode, die Namen sind anders.
Beispiel:
Dies würde die Arbeit in Objective-C, aber Sie nicht bekommen konnten ähnliche Funktionalität in C++, weil das argument Anzahl und die Typen sind die gleichen, nur argument-Funktionen sind Verschieden. In einigen wenigen Fällen, die C++ - Modell erreichen kann, mehr nützliche Funktionen. Dies zeigt die NSKeyedArchiver Klasse:
Hier hatten Sie, um Argumenttypen Teil der moethod Namen, das ist hässlich. Wenn ich wählen könnte zwischen C++ überladen und Objective-C "überladen", ich würde noch immer für letzteres entscheiden.
Könnte man anfangen, mit einer generischen Methode, die Routen basierend auf dem Typ des Objekts übergeben.
Dann können Sie den Typ überprüfen, um zu sehen, ob es NSData oder UIImage und leiten Sie intern an die entsprechenden Methoden.
Können Sie auch wählen, Sie unterstützen nur die erwarteten Typen und anmutig Rückgang zu verarbeiten, nicht unterstützte Typen oder scheitern ausdrücklich.
Nachschlagen NSAssert1, NSAssert2, etc für einen anderen Ansatz.
Beachten Sie, dass wenn Sie müssen /wollen überlast-Funktionen bei der Kombination von Objective-C mit C++ ist es möglich. Ich nur erwähne dies, weil in XCode, die Sie brauchen, um Ihre .m-Datei ein .mm-Datei für Sie, um es zu behandeln, die ausgelöst mich für ein paar Minuten.
Beispiel-header:
Wenn Sie auch dieses in einer .m-Datei erhalten Sie eine Warnung:
Ändern Sie Ihre .m-Datei in eine .mm löscht das Thema.
Können Sie überlastung von C-Funktionen mit neueren Compiler - Syntax ist ein wenig klobig, aber (nichts, was eine schnelle #define nicht lösen können), aber es funktioniert gut.
überladen von Funktionen in C
Kategorien bieten eine weitere Möglichkeit zu emulieren c-Stil überladen von Methoden in Objective C. Als Beispiel betrachten wir das folgende interface-Deklarationen:
Den verschiedenen parameter-Typen werden gelöst, indem die Kategorien.