2010-12-06 8 views
23

¿Cómo puedo hacerlo para que cualquier clase que herede de mi clase base se vea obligada a anular un método específico? No quiero usar un protocolo, porque eso no automatizaría este comportamiento.Forzar clases secundarias para reemplazar el método

@interface MyBaseClass : NSObject 
{ 
} 

- (void)performAnAction; 

@end 

@implementation MyBaseClass 

- (void)performAnAction 
{ 
    @throw([NSException exceptionWith...]); 
} 

@end 

Respuesta

45

¿Exactamente qué quieres decir con forzarlos a anularlo? Si simplemente poner en práctica el método de los padres, así:

- (void)performAction { 
    NSAssert(NO, @"The method %@ in %@ must be overridden.", 
     NSStringFromSelector(_cmd), NSStringFromClass([self class])); 
} 

entonces va a lanzar una excepción en tiempo de ejecución si la clase de niño no anularlo. Lamentablemente, no hay forma de aplicar esto en tiempo de compilación.

+0

Entonces, ¿no es posible mostrar una advertencia? – aryaxt

+1

No. Solo documente la clase apropiadamente para que sea obvio que este método debe ser anulado. –

+0

Esto no funcionará si la subclase llama a [super performAction]; –

1

Usted podría lanzar una excepción. Mientras esto esté bien documentado, entonces IMO es un uso razonable de excepciones ya que realmente es un error de programación.

Cuestiones relacionadas