2009-11-10 19 views
10

ben şöyle bir tasarım uygulamak için çalışıyorum:iPhone Objective-C foreach tasarım

Touch sınıfı: bir arayüz olarak eylemlerini çeşitli sınıflar ondan devralan:
MoveTouch sınıf
JumpTouch sınıf
InterfaceTouch sınıf

Ardından, Touch nesnelerinin bir listesini almak istiyorum. Daha sonra, bu büyük listeden SADECE MoveTouch nesnesini SADECE (diğerlerini değil) ve daha sonra tüm JumpTouch nesnelerini ayırmak istiyorum. Ne yazık ki, for (MoveTouch* t in touches) istediğimi yapmıyor; tüm listeden her şey harekete geçer.

cevap

36

Sen sınıf türü için test etmek gerekir:

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

Ben nesnel C programcısı değilim. Sizin durumunuzda, "(Dokunuşlarla dokunma)" için ve bu nesnenin bir MoveTouch veya bir JumpTouch ve benzeri olup olmadığını anlamak için listenizden geçmeniz gerektiğini düşünüyorum.

Ancak polimorfizm fikri, bunu yapmamanızdır. Döngünün sırasında ayrılmıyorsun. Gerçekleştirmek istediğiniz eylem, arayüzde tanımlanmalı ve her bir alt sınıf, bu eylem için farklı bir uygulama uygular. Polimorfizm bununla ilgili.

+0

... Yani [t update] çağrısı gibi bir şey yaparsınız ve her bir öğe bir güncelleme döngüsünde ne yapacağına karar verir. Ama bu evrensel değil. Bir sınıfa göndermek istediğiniz bir mesajınız olduğunda, başka bir zaman değil, birçok kez vardır. –

+0

evrensel değil, ama bence, koku alma eğilimindedir. Özellikle de sınıfları kendiniz de tasarladığınızı belirttiğinizde. –

+0

Aslında bununla polimorfizm yapmıyorum. Temel isteğim farklı dokunuşları ayırmak için bir yoldu. Dokunma türü (Hareket, Atlama, Arayüz, vb.), "TouchesBegan" içinde gerçekleşen yaratılışının hemen üzerine karar verilebilir. O andan itibaren, dokunduğunuzda ya da dokunduğunuzda hareket ettiğinizde, ne olacağının işlevselliğini ayırmak çok daha kolay olabilir. Sanırım belki miras, bunun için biraz fantezi mi? Belki sadece basit bir enum çalışır? –