2009-11-10 11 views
10

Estoy tratando de implementar un diseño de la siguiente manera:iPhone Objective-C foreach diseño

Touch clase: actúa como una interfaz, varias clases heredan de ella:
MoveTouch clase
JumpTouch clase clase
InterfaceTouch

Luego quiero tener una lista de objetos Touch. Luego quiero poder quitar todos los objetos MoveTouch SOLAMENTE (no los otros), y luego todos los objetos JumpTouch por separado, etc., fuera de esta gran lista. Lamentablemente, for (MoveTouch* t in touches) no hace lo que quiero; todo en la lista completa actúa.

Respuesta

36

Es necesario poner a prueba para el tipo de clase:

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

No soy un programador Objective C.

En su caso, creo que necesita revisar su lista con "para (Toque * en toques)" y en el cuerpo averiguar si ese objeto es un MoveTouch o un JumpTouch y así sucesivamente.

Pero la idea del polimorfismo es que no haces esto. No ordena 'out' durante su ciclo. La acción que desea realizar debe definirse en la interfaz, y cada clase descendiente implementa una implementación diferente para esa acción. De eso se trata el polimorfismo.

+0

... lo que significa que harías algo como llamar a [t update] y luego cada elemento decidiría qué hacer en un ciclo de actualización. Pero eso no es universal. Hay muchas veces cuando tiene un mensaje que desea enviar a una clase, y no a otra. –

+0

no es universal, pero tiende a oler, en mi opinión. Especialmente cuando indica que está diseñando las clases también. –

+0

En realidad, no estoy haciendo polimorfismo con esto. Mi deseo básico era una forma de separar diferentes tipos de toques. El tipo de toque (Mover, Saltar, Interfaz, etc.) se puede decidir inmediatamente después de su creación, lo que ocurre dentro de "touchesBegan". A partir de ese momento, es mucho más fácil separar la funcionalidad de lo que sucede cuando MUEVA ese toque o FINALIZA ese toque, etc. Supongo que tal vez la herencia sea un poco sofisticada para esto. Tal vez solo una simple enumeración funcionaría? –

Cuestiones relacionadas