J'ai rencontré un scénario étrange lié à l'héritage de classe dans Objective-C.Méthode d'héritage Objective-C correspondant
Disons que j'ai trois classes A, B et C héritant d'une classe de base X. Les classes A, B et X ont le constructeur:
- (id)InitWithString:(NSString*)someString andDelegate:(id<SomeProtocol>)aDelegate
la seule différence étant que chaque classe utilise un autre protocole pour le délégué. Qu'est-ce qui se passe est que pour A et B le compilateur essaie d'utiliser la méthode de C. Un avertissement m'informe que les protocoles requis par le constructeur de la classe C n'est pas implémenté par le délégué fourni. Il n'y a rien de mal avec le délégué lui-même, puisque chaque classe a un délégué qui implémente le bon protocole pour le propre constructeur des classes. Tout fonctionne bien à l'exécution et les bonnes fonctions sont appelées pour toutes les classes.
J'ai essayé que les constructeurs retournent A *, B * ou C * au lieu de l'identifiant anonyme, bien que cela ne résout toujours pas le problème.
La seule chose qui fonctionne est de faire un casting à la bonne classe comme ceci:
instanceOfA = [(A*)[A alloc] InitWithString:@"" andDelegate:aDelegate];
Cela semble superflu et inutile. Il me manque probablement quelque chose d'évident ici.
Ne jamais nommer une méthode avec une majuscule initiale, c'est une abomination. Aussi, vous ne devriez pas utiliser * et * dans le nom. Dans C# le nom 'InitWithStringAndDelegate()' est bon et bon, dans Objective-C il devrait être 'initWithString: delegate:'. – PeyloW
Ouais, utiliser "et" est généralement une mauvaise idée car vous devez le changer si vous ajoutez un autre paramètre. Le capital initial est principalement une question de goût et de convention. Je ne ressens aucune obligation de suivre la convention d'Apple, d'autant plus que cela m'aide à identifier facilement mes propres méthodes dans une classe qui sous-classe une classe Cocoa. Cependant, tout cela est hors sujet :) –