2010-02-18 11 views
118

Según mi conocimiento, Objective-C no es compatible con la sobrecarga de métodos. ¿Cuál puede ser la alternativa para esto en Objective-C? ¿O debería usar siempre un nombre de método diferente?¿Sobrecarga del método en Objective-C?

Respuesta

174

Correcto, el objetivo C no es compatible con la sobrecarga de métodos, por lo que debe utilizar diferentes nombres de métodos.

Tenga en cuenta, sin embargo, que el "nombre de método" incluye las palabras clave método de firma (el parámetro nombres que vienen antes de la ":" s), por lo que los siguientes son dos métodos diferentes, aunque ambos empiezan " WriteToFile ":

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

(los nombres de los dos métodos son "WriteToFile: fromInt:" y "WriteToFile: fromstring:").

+2

@RaheelSadiq No es la sobrecarga debido a que los nombres de los métodos (En ObjC: 'selectores') son diferentes. Siendo diferente, ninguno es considerado 'sobrecargado'. Si writeToFile: from: se definieron dos veces, con solo el parámetro * types * siendo diferente, entonces eso sería una sobrecarga. Sin embargo, como se dijo, esto no es compatible con ObjC como con otros lenguajes, incluidos Java y ahora Swift. –

+0

No solo los nombres de los parámetros en sí, sino que incluso los dos puntos forman parte del nombre del método, de modo que - (void) writeToFile: (NSString *) vía de acceso: (int) anInt; y - (void) writeToFile: (NSString *) ruta: (NSString *) aString; también son métodos diferentes. – Kaiserludi

19

David tiene razón en que la sobrecarga de métodos no es compatible con Objective-C. Es similar a PHP en ese sentido. Como también señala, es una práctica común definir dos o más métodos con diferentes firmas de la manera en que lo ejemplifican. Sin embargo, también es posible crear un método usando el tipo "id". A través del tipo "id", puede enviar cualquier objeto (y cualquier primitiva usando la clase NSNumber) al método y luego desde el mismo método puede probar su tipo y lanzar la excepción apropiada si es necesario. Aunque esto tiene un impacto de rendimiento menor, lo más probable es que sea nominal o insignificante a menos que esté procesando grandes cantidades de datos.

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

Este es también un hermoso lugar para poner en práctica un protocolo para hacer cumplir el tipo de objeto, que puede hacerse de este modo:

(id<MyProtocol>)object 
22

puede valer la pena mencionar que, aunque Objective-C doesn' t soporte método sobrecarga, Clang + LLVM soporta función sobrecarga para C. Aunque no es exactamente lo que está buscando, podría ser útil en algunas situaciones (por ejemplo, al implementar ligeramente pirateado (va en contra de la encapsulación)) versión del visitor design pattern)

Aquí está un ejemplo sencillo de cómo funciona la sobrecarga de funciones:

__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

Uno podría pensar que esta sugerencia, combinada con el método swizzling, podría conducir a métodos "sobrecargables" ... Por qué uno debería hacerlo, con 'id' y' isKindOfClass: 'a disposición de los usuarios, sin embargo, _es una historia diferente_. .. –

+1

@alexgray Veo tu punto, 'id' y' isKindOfClass: 'cubren la mayoría de los escenarios prácticos. Una razón por la que preferiría sobrecargar, es la selección automática del tipo más específico atendido, lo que implicaría una pequeña sobrecarga para mantener con la verificación de tipo explícita. –

+1

La documentación de Clang dice explícitamente que lo que hace es proporcionar el nombre de C++ que cambia para C.Y eso es básicamente el compilador haciendo automáticamente detrás de escena lo que se hace en Objective-C dando a los métodos nombres que son distintos al abarcar (en forma más larga) los tipos de argumento. –