J'ai une classe appelée AddressCard à partir d'un exemple dans "Programmation en Objective C", et j'implémente une méthode isEqual:.Strict vs loose typing lors du remplacement d'une méthode
La signature de cette méthode dans NSObject utilise un typage lâche pour le paramètre:
- (BOOL)isEqual:(id)anObject
OTOH, l'exemple de code dans le livre utilise le typage strict:
- (BOOL) isEqual:(AddressCard *) aCard
Je ne suis pas sûr comprendre parfaitement ce que le compilateur fait dans ce cas. J'ai essayé de comparer une AddressCard à un NSString ([aCard isEqual: @"Foo"]
) en m'attendant à une erreur d'exécution (si le système utilise ma méthode) ou que le système appelle la version de IsEqual de NSObject.
Au lieu de cela, ma méthode a été appelée (même si le paramètre était un NSString et non un AddressCard) et a soulevé une exception lorsque mon IsEqual: a essayé d'appeler aa méthode spécifique à AddressCard:
- (BOOL) isEqual:(AddressCard *) aCard {
if ([name isEqualToString: [aCard name]] && /*here I get the error*/
[email isEqualToString:[aCard email]]) {
return YES;
}else {
return NO;
}
}
Qu'est-ce qui se passe ? Comment sur Terre est un NSString étant passé à une méthode qui attend quelque chose d'autre? Est-ce que changer la signature d'une méthode est OK en la surchargeant?
Aucun avertissement du tout. Cela déclenche juste une exception dans l'exécution. – cfischer
Je m'attendrais certainement à un avertissement aussi. Semble un peu bâclé ... – cfischer
BTW, si je change la signature de ma méthode isEqual:, donc il correspond à NSObject Je reçois un avertissement: "Conflicting types for '- (BOOL) estEqual: (id *) aCard. ? O :-) – cfischer