2010-09-08 14 views
7

¿Es posible la sobrecarga de funciones en el objetivo C?
Bueno, la mayoría de los programadores dice que no,
pero parece que sea posible,
por ejemplo:¿Es posible la sobrecarga de funciones en el objetivo C?

-(int)AddMethod:(int)X :(int)Y 
{ 
    return X + Y; 
} 
-(int)AddMethod:(int)X 
{ 
    return X; 
} 

para llamar primero uno escribir [self AddMethod :3];
llamar último escribir [self AddMethod: 3 :4];

+0

que he leído muchas veces los programadores dicen que la sobrecarga de funciones no es posible en C objetiva – Matrix

+0

Estoy en lo cierto? .... – Matrix

+6

Esto no está sobrecargando, sus métodos tienen diferentes selectores (= nombres). Uno es 'AddMethod:' y el otro es 'AddMethod ::' – Sven

Respuesta

22

La sobrecarga de métodos no es posible en Objective-C. Sin embargo, su ejemplo realmente funcionará porque ha creado dos diferentes métodos con diferentes selectores: -AddMethod:: y AddMethod:. Hay dos puntos para cada parámetro entrelazado. Es normal poner un poco de texto también, p. -addMethodX:Y: pero no es necesario.

+1

No * tiene * para etiquetar el segundo parámetro, pero en realidad ... tiene que hacerlo. No hay razón para hacer que tu código sea intencionalmente obtuso. – kubi

+2

@kubi: completamente de acuerdo. Es el mismo tipo de "no tiene que", como en "no tiene que usar letras en nombres de variables C, solo puede usar cadenas de caracteres de subrayado". – JeremyP

+0

estoy confundido ... pensé que contaba como método de sobrecarga (ya sea una cantidad diferente de argumentos o tipos) EDITAR: ok, parece que solo los tipos cuentan como sobrecarga para ustedes ...En tantos ejemplos en línea, veo que incluso la firma diferente cuenta como "sobrecarga". Suspiro... – dtc

4

No, no lo es, principalmente porque Objective-C no usa funciones, usa métodos.

Sobrecarga de método, por otro lado, es posible. Más o menos

tener en cuenta, si se quiere, una clase con un método toma un argumento en la forma de un NSString * o una const char *:

@interface SomeClass : NSObject { 

} 

- (void)doThingWithString:(NSString *)string; 
- (void)doThingWithBytes:(const char *)bytes; 

@end 

Mientras que el método en sí no va a ir por ahí la elección del método apropiado con una entrada dada; Todavía se podría decir que doThing: estaba sobrecargado, al menos en el sentido de que los dos métodos toman un parámetro diferente para lograr la misma funcionalidad.

+2

¿Qué significa 15.? – vodkhang

+0

Las respuestas deben tener al menos 15 caracteres de longitud; así que desarrollé la mía un poco. ;) –

+5

El ejemplo no es incluso * tipo de * sobrecarga, estos son simplemente dos métodos diferentes para los cuales la nomenclatura implica cierta relación semántica. Es solo la alternativa comúnmente utilizada en ausencia de sobrecarga. –

2

Técnicamente, la sobrecarga de métodos no es posible en Objective-C. En la práctica, generalmente puede lograr los mismos resultados, incluso en los casos en que no podría hacerlo en C++. En Objective-C, los nombres de los métodos incluyen dos puntos delante de cada argumento, y los dos puntos son PARTE DEL NOMBRE DEL MÉTODO, lo que significa que su ejemplo utiliza diferentes nombres de método. En la práctica, esto se convierte en una especie de funcionalidad de pseudo-nombre-parámetro, y puede obtener una sobrecarga de pseudo método mediante el argumento FUNCTION en lugar del argumento TYPE. En la mayoría de los casos, esto realmente será más útil, pero no es una sobrecarga de métodos en sentido estricto, porque los nombres de los métodos son diferentes.

Ejemplo:

-(void)makeSquareWithX1:(float)x1 Y1:(float)y1 X2:(float)x2 Y2:(float)y2; 
-(void)makeSquareWithX1:(float)x1 Y1:(float)y1 width:(float)width height:(float)height; 

Esto funcionaría en Objective-C, pero no se podía conseguir una funcionalidad similar en C++, debido a que el número de argumento y tipos son los mismos, sólo las funciones de argumentos son diferentes. En algunos casos, el modelo C++ puede lograr una funcionalidad más útil. Esto se demuestra por la clase NSKeyedArchiver:

-(void)encodeFloat:(float)realv forKey:(NSString *)key 
-(void)encodeInt32:(int32_t)intv forKey:(NSString *)key 

Aquí tuvieron que hacer los tipos de argumento parte del nombre moethod, que es feo. Si pudiera elegir entre una sobrecarga de C++ y una "sobrecarga" de Objective-C, aún elegiría la última.

-1

categorías proporcionan otra manera de emular método c-estilo sobrecarga en Objective C. Como ejemplo, considerar las siguientes declaraciones de interfaz:

@interface MyClass 
{ 
} 
@end 

@interface MyClass (MethodVersion1) 
- (void) doSomething : (int) val; 
@end 

@interface MyClass (MethodVersion2) 
- (void) doSomething : (double) val; 
@end 

Los diferentes tipos de parámetros se resuelven por las categorías.

2

Se podría comenzar con un método genérico que rutas en función del tipo de objeto se pasa en.

- (void)doSomething:(id)obj; 

entonces usted puede comprobar el tipo para ver si es NSData o UIImage y la ruta internamente a la métodos apropiados.

- (void)doSomethingWithData:(NSData *)data; 
- (void)doSomethingWithImage:(UIImage *)image; 

También puede optar por solo admitir los tipos esperados y declinar con elegancia para procesar los tipos no admitidos o fallar explícitamente.

Busque NSAssert1, NSAssert2, etc. para otro enfoque.

0

Tenga en cuenta que si necesita/desea sobrecargar funciones al combinar Objective-C con C++ es posible. Solo menciono esto porque en XCode necesitas cambiar tu archivo .m a un archivo .mm para que lo trate de esta manera, lo que me provocó algunos minutos de inactividad.

Ejemplo de cabecera:

void addMethod(NSInteger a); 
void addMethod(NSInteger a, NSInteger b); 

Si va a incluir esto en un archivo .m obtendrá una advertencia:

Conflicto en los tipos de 'addMethod'

Cambio su archivo .m en .mm borra el problema.

0

Puede sobrecargar las funciones de C con los compiladores más nuevos. Sin embargo, la sintaxis es un poco torpe (nada #define rápido no puede corregir), pero funciona bien.

function overloading in C

Cuestiones relacionadas