Respuestas:
Correcto, el objetivo-C no admite la sobrecarga de métodos, por lo que debe usar diferentes nombres de métodos.
Sin embargo, tenga en cuenta que el "nombre del método" incluye las palabras clave de firma del método (los nombres de los parámetros que aparecen antes de ":" s), por lo que los siguientes son dos métodos diferentes , a pesar de que ambos comienzan a "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:").
Vale la pena mencionar que incluso si Objective-C no admite la sobrecarga de métodos , Clang + LLVM sí admite la sobrecarga de funciones para C. Aunque no es exactamente lo que está buscando, podría resultar útil en algunas situaciones (por ejemplo, cuando implementar una versión ligeramente pirateada (va en contra de la encapsulación) del patrón de diseño del visitante )
Aquí hay un ejemplo simple 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));
id
y isKindOfClass:
a su disposición, sin embargo, es una historia diferente ...
id
y isKindOfClass:
cubro los escenarios más prácticos. Una razón por la que podría preferir la sobrecarga es la selección automática del tipo más específico atendido, que incurriría en una pequeña sobrecarga para mantener con una verificación de tipo explícita.
David tiene razón en que el método de sobrecarga no es compatible con Objective-C. Es similar a PHP en ese sentido. Como él también señala, es una práctica común definir dos o más métodos con diferentes firmas en la forma en que ejemplifica. 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 que use la clase NSNumber) al método y luego desde el propio método puede probar su tipo y lanzar la excepción apropiada si es necesario. Aunque esto tiene un impacto menor en el rendimiento, 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 también es un lugar hermoso para implementar un protocolo para imponer el tipo de objeto, que se puede hacer así:
(id<MyProtocol>)object