2012-04-30 7 views
4

に(派生クラス)IVARのクラスを変更する私は2つの基本クラス、ContainerGizmoを有していると仮定する。クラスContainerのインスタンス変数は、Gizmoです。サブクラス

は今、私はContainerをサブクラス(そのSubContainerを呼び出す)私もGizmoSubGizmo)をサブクラス化。 SubContainerのいくつかの方法では、GizmoにはSubGizmoがないいくつかのプロパティにメッセージを送信する必要があります。私はこれらのメッセージを送信できるので、SubContainerにクラスSubGizmoであるようにivarを上書きする方法はありますか?

今私はそれがSubGizmoに私は、そのようなプロパティやメソッドを使用する必要があるたびに、私の継承IVARをキャストして動作させることができます。私はそのような行動をしたい理由はここに

は次のとおりです。私はすでに動作しているゲームがありますが、私は追加複数のモードは、難しくは維持するために取得します。各モードで実行されるメソッドを変更/追加したい場合私は3つの異なるゲームコントローラオブジェクトに行き、変更を行う必要があります。サブクラス化することで

は、私は、基本クラスで、メインゲームの仕組みを維持し、各モードのサブクラスを作りたかったのです。このようにして、基本クラスの変更は各モードを反映します。しかし、各コントローラとゲームオブジェクトは異なるモードのための新しいメソッドを持ち、互いにメッセージを送ります。これは私の問題が発生している場所です。

+1

プログラムは、私はあなたが私のクラス名を承認するように見えるうれしい – justin

+2

少ないあいまいになります。文字といくつかの星の数は、追跡するのが難しかった。 :) –

+0

@JacquesCousteauははるかに明確です:) – justin

答えて

2

ちょうどこのようなアプローチを用いて、型の安全性及び変換ロジックを導入:

@interface SubContainer() 

- (SubGizmo *)subGizmo; 
// setter is often unnecessary 
- (void)setSubGizmo:(SubGizmo *)pSubGizmo; 

@end 

@implementation SubContainer 

... 

- (SubGizmo *)subGizmo 
{ 
    Gizmo * ret = self.gizmo; 
    // sanity check the type to ensure this is properly initialized, 
    // or return nil if holding a Gizmo is valid in this context: 
    assert([ret isKindOfClass:[SubGizmo class]]); 
    return (SubGizmo *)ret; 
} 

- (void)setSubGizmo:(SubGizmo *)pSubGizmo 
{ 
    self.gizmo = pSubGizmo; 
} 

- (void)addWater 
{ 
    [self.subGizmo addWater]; 
} 

@end 

しかし、クリープ複雑さがタイプでより多くのバリエーションを提案は考慮に値します。

+1

これはかなりきちんとしています。 SubGizmo * subg =(SubGizmo *)ギズモ;そのようなメッセージを送信するすべてのメソッドの冒頭に。私は彼らがあなたのものがよりグローバルであるのに対し、彼らはほとんど同じことをすると思います。 –

+0

@ Kaan yup、複数の場所で使用されている場合は、ノイズを大幅に削減し、変更する場合には変更の数を減らします。 – justin

0

最も簡単な方法は、コンテナではなく、ギズモでSubGizmoを使用することです。あなたには、いくつかの理由で直接それを行うことができない場合

しかし、あなたは実行時にサブコンテナを変更することができます:-)(私はあなたがそれを必要とする例を与えることができ、class_addIvarまたはclass_addMethodを求める)が、それはしていませんXcodeの警告を避けるために役立ちます。

+1

実行時に既存のクラスにivarを追加することはできません。class_addIvarは登録されていないクラスのみに適用されます。 –

+0

@Matthiasはい。しかし、私は別のサブクラスのB(B ***)に属する別のインスタンスをA(A ***)の別のサブクラスに持っていきたいと思っています。 –

+0

@ JoshuaWeinberg:はい、もちろんですが、私はOPにサブクラスのコントロールがあることを理解しました。ドット表記でプロパティにアクセスしようとすると – Matthias

1

あなたのivarにタイプIDを使用するだけで、警告を避けるために適切なヘッダーファイルを含める必要があります。

+0

が機能しません。私は、ベースクラスにはないものにアクセスするたびに、必要なサブクラスにキャストすることに固執すると思います。助けてくれてありがとうございました –

-2

NSNotificationsを使用して、すべてのゲームコントローラにアップデートを送信できます。