2009-11-10 9 views
10

Je suis en train de mettre en œuvre une conception comme suit:iPhone Objective-C foreach conception

Touch classe: agit comme une interface, plusieurs classes en héritent:
MoveTouch classe
JumpTouch classe de classe
InterfaceTouch Puis je veux avoir une liste d'objets Touch. Je veux ensuite être en mesure de supprimer tous les objets MoveTouch SEULEMENT (pas les autres), puis tous les objets JumpTouch séparément, etc., de cette grande liste. Malheureusement, for (MoveTouch* t in touches) ne fait pas ce que je veux; tout dans la liste entière est suivi.

Répondre

36

Vous devez tester le type de classe:

for (Touch *t in touches) { 
    if ([t isKindOfClass:[MoveTouch class]]) { 
    MoveTouch *mt = (MoveTouch *)t; 
    // do what you want with mt 
    } 
} 
0

Je ne suis pas un objectif programmeur C.

Dans votre cas, je pense que vous devez parcourir votre liste avec ce "pour (Touch * in touch)" et dans le corps comprendre si cet objet est soit un MoveTouch ou un JumpTouch et ainsi de suite.

Mais l'idée du polymorphisme est que vous ne le faites pas. Vous ne sortez pas pendant votre boucle. L'action que vous souhaitez exécuter doit être définie dans l'interface et chaque classe descendante implémente une implémentation différente pour cette action. C'est ce que le polymorphisme est tout.

+0

... ce qui signifie que vous feriez quelque chose comme call [t update] et que chaque élément déciderait de ce qu'il faut faire lors d'un cycle de mise à jour. Mais ce n'est pas universel. Il y a beaucoup de moments où vous avez un message que vous voulez envoyer à un cours, et pas un autre. –

+0

pas universel, mais a tendance à sentir, à mon avis. Surtout quand vous indiquez que vous concevez eux-mêmes les classes. –

+0

Je ne fais pas de polymorphisme avec ça. Mon but premier était de trouver un moyen de séparer différents types de touches. Le type de toucher (Move, Jump, Interface, etc.) peut être décidé dès sa création, ce qui se passe dans "touchesBegan". A partir de là, il est beaucoup plus facile de séparer la fonctionnalité de ce qui se passe lorsque vous déplacez cette touche ou END qui touche, etc. Je suppose que l'héritage est un peu fantaisiste pour cela? Peut-être qu'une simple énumération fonctionnerait? –