2010-12-06 5 views
23

Comment puis-je faire en sorte que toute classe héritant de ma classe de base soit forcée de remplacer une méthode spécifique? Je ne veux pas utiliser de protocole, car cela ne rendrait pas ce comportement automatisé.Forcer les classes enfants à surcharger la méthode

@interface MyBaseClass : NSObject 
{ 
} 

- (void)performAnAction; 

@end 

@implementation MyBaseClass 

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

@end 

Répondre

45

Comment voulez-vous dire, les forcer à passer outre? Si vous implémentez simplement la méthode mère comme ceci:

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

il jetteront une exception à l'exécution si la classe enfant ne parvient pas à remplacer. Malheureusement, il n'y a aucun moyen d'appliquer ceci à la compilation.

+0

Il n'est donc pas possible d'afficher un avertissement non plus? – aryaxt

+1

Non. Il suffit de documenter correctement la classe pour qu'il soit évident que cette méthode doit être surchargée. –

+0

Cela ne fonctionnera pas si la sous-classe appelle [super performAction]; –

1

Vous pourriez juste jeter une exception. Tant que cela est bien documenté, alors OMI est une utilisation raisonnable des exceptions, car il s'agit vraiment d'une erreur de programmation.

Questions connexes