2009-11-10 5 views
10

次のように私が設計を実装しようとしています:iPhone Objective-Cのforeachの設計

Touchクラス:インタフェースとして機能し、いくつかのクラスが継承:
MoveTouchクラス
JumpTouchクラス
InterfaceTouchクラスを

次に、Touchオブジェクトのリストが必要です。私は次に、すべてのMoveTouchオブジェクト(他のものではない)だけを外してから、この大きなリストの中から別のすべてのJumpTouchオブジェクトを取り除きたいと考えています。残念ながら、for (MoveTouch* t in touches)は私が望むことをしません。リスト全体のすべてが行動を起こします。

答えて

36

あなたはクラス型をテストする必要があります:私はObjective Cのプログラマじゃない

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

あなたの場合、あなたはあなたのリストを "for(Touch in inuches)"とし、そのオブジェクトがMoveTouchかJumpTouchかなどであるかどうかを調べる必要があると思います。

しかし、多型の考えは、あなたがこれをしないということです。ループ中にソートしないでください。実行するアクションはインターフェイスで定義され、各子孫クラスはそのアクションに対して異なる実装を実装します。それが多形性のすべてです。

+0

...これは、[t update]という呼び出しを実行し、各アイテムが更新サイクルで何をすべきかを決定することを意味します。しかしそれは普遍的ではありません。 1つのクラスに送信するメッセージがあり、別のクラスには送信しないメッセージがあるときは、たくさんあります。 –

+0

普遍的ではありませんが、私の意見では、においがちです。特に、あなた自身がクラスをデザインしていることを示しているときは。 –

+0

私は実際にこれで多型を行っていません。私の基本的な望みは、いろいろな種類のタッチを分ける方法でした。タッチの種類(Move、Jump、Interfaceなど)は、作成時に直ちに決定することができます。これは「touchesBegan」内で発生します。それ以来、あなたがそのタッチを動かすときに起こることの機能性を分離する方がはるかに簡単です。そうすれば、継承はちょっと想像してもらえますか?たぶん簡単な列挙型はうまくいくでしょうか? –

関連する問題