2011-07-28 13 views
20

Tengo problemas para calcular la hora para anular con precisión un método en una de mis subclases.Objective-C - Método de anulación en la subclase

I tienen subclase (ClassB) de otro CustomClass (ClassA):

@interface ClassB : ClassA { 
} 

y dentro de ClassA, hay un método llamado:

-(void)methodName; 

que dispara correctamente.

Sin embargo, necesito este método para disparar en ClassB.

He tratado de aplicación (en ClassB):

-(void)methodName { 
    [super methodName]; 
} 

pero todavía no se disparará en ClassB.

¿Cómo puedo anular methodName para que se active en ClassB?

+0

¿Cómo inicializas el objeto? – Thys

Respuesta

25

Usted sólo tiene que añadir el código personalizado en methodName en ClassB:

- (void)methodName 
{ 
    // custom code 

    // call through to parent class implementation, if you want 
    [super methodName]; 
} 
+6

Eso es exactamente lo que ya hizo ... –

+3

No dice dónde pone su código agregado. Además, esta es la forma correcta de hacerlo. –

+0

No es necesario eliminar [super methodName]; para ejecutar methodName en classB .. –

18

Primero, asegúrese de que su método init crea un objeto ClassB y no un objeto ClassA (u otra cosa).

Entonces, si usted desea crear un methodName completamente diferente ClassB (void): Método que la encontrada en classA, este es el camino a seguir:

Super es la superclase. Al llamar a [super methodName] le está pidiendo a ClassA que ejecute su propio methodName. Si desea anular completamente methodName de la clase A, simplemente no llame a super.

Así que, básicamente, en la ejecución de su ClassB de methodName

-(void)methodName { 
    // Remove [super methodName] 
    // Insert the code you want for methodName in ClassB 
} 

no dude en leer Messages to self and super en el documento de lenguaje de programación de Apple Objective-C.

+0

¿No es esta la respuesta correcta para esta pregunta? – arqam

0

Por escrito:

-(void)methodName { 
    [super methodName]; 
} 

se indica al compilador: Al ejecutar methodName de Clase B, llame methodName de su superclase (Clase A). Entonces, si desea que la Clase B haga algo diferente, debe escribir un código que tenga un comportamiento diferente. De esta manera: "¡Hola, mundo"

-(void)methodName { 
    NSLog(@"Hello, world!"); 
} 

Ahora llamando methodName de Clase B se imprimirá en la consola.

0
-(void)methodName { 
    [super methodName]; 
} 

Quiere llamar a methodName (en ClassB), simplemente elimine [super method] entonces puede dispararlo. Causa súper es llamar de nuevo a claseA

-1

Aunque esta pregunta es demasiado viejo, pero hay algunos alumnos alféizar como todos los expertos era, A continuación se cita de documentación de Apple. "El nuevo método debe tener el mismo tipo de devolución y tomar el mismo número y tipo de parámetros que el método que está anulando". respuesta completa se puede encontrar en Apple method overriding documentation Espero que esto ayude a alguien.

+0

El desbordamiento de pila no debe copiar toda la documentación. Como OP no hizo esto mal, esto no responde la pregunta. – vikingosegundo

Cuestiones relacionadas