Ok, donc j'utilise Objective-C. Maintenant, dire que j'ai:Obj-c méthode override/problème de polymorphisme
TopClass : NSObject
- (int) getVal {return 1;}
MidClass : TopClass
- (int) getVal {return 2;}
BotClass : MidClass
- (int) getVal {return 3;}
J'ai alors mis des objets de chaque type dans un NSMutableArray et prendre un. Ce que je veux faire est de lancer la fonc getVal sur le type d'objet approprié, mais quand je mets
id a = [allObjects objectAtIndex:0];
if ([a isKindOfClass:[TopClass class]])
{
int i;
i = [a getVal];
}
Je reçois tout d'abord un avertissement sur plusieurs méthodes appelées getVal (probablement parce que le compilateur ne peut pas déterminer le type d'objet réel jusqu'à l'exécution). Mais plus sérieusement, je reçois aussi une erreur "valeur vide non ignorée comme il se doit" et elle ne compilera pas.
Si je n'essaie pas d'utiliser le retour de [un getVal] alors il compile bien, par ex.
[a getval]; //obviously no good if I want to use the return value
Il travaillera également si j'utilise des déclarations isMemberOfClass pour lancer l'objet à une classe avant d'exécuter la fonction par exemple
if ([a isMemberOfClass:[BotClass]) i = [(BotClass*) a getVal];
Mais je ne devrais sûrement pas avoir à faire cela pour obtenir la fonctionnalité dont j'ai besoin? Sinon, je devrai mettre une instruction pour chaque sous-classe, et pire, ajouter une nouvelle ligne si j'ajoute une nouvelle sous-classe, ce qui annule plutôt le point de surcharge de la méthode, n'est-ce pas?
Sûrement il y a un meilleur moyen?
Vous ne devriez jamais nommer une méthode dans Objective-C '-getSomething', vous l'appelez simplement' -quelque chose '. –