4

2つの基本クラスがあると仮定ContainerGizmoます。クラスContainerには、クラスのインスタンス変数がありますGizmo

今、私はサブクラス化Container(それを呼び出しますSubContainer)し、サブクラス化GizmoSubGizmo)もします。のいくつかのメソッドでは、持っていないが持っているSubContainerいくつかのプロパティにメッセージを送信する必要があります。これらのメッセージを送信できるように、ivarをオーバーライドしてクラスに含める方法はありますか?GizmoSubGizmoSubGizmoSubContainer

今のところSubGizmo、そのようなプロパティやメソッドを使用する必要があるたびに、継承したivarをキャストすることで機能させることができます。

これが私がそのような振る舞いをしたい理由です:私はすでに動作するゲームを持っていますが、追加するモードが多いほど、それを維持するのが難しくなります。各モードで実行されるメソッドを変更/追加したい場合; 3つの異なるゲーム(コントローラーオブジェクト)に移動して変更を加える必要があります。

サブクラス化することで、メインのゲームメカニズムを基本クラスに保持し、モードごとにサブクラスを作成したいと思いました。このように、基本クラスで行った変更は、各モードに反映されます。ただし、各コントローラーとゲームオブジェクトには、異なるモード用の新しいメソッドがあり、相互にメッセージを送信します。これが私の問題の原因です。

4

4 に答える 4

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

ただし、忍び寄る複雑さは、タイプのバリエーションを増やすことを検討する価値があることを示唆しています。

于 2012-04-30T06:21:26.443 に答える
1

ivarにタイプIDを使用するだけで、警告を回避するために適切なヘッダーファイルをインクルードするだけで済みます。

于 2012-04-30T06:02:12.517 に答える
0

最も簡単な方法は、GizmoではなくContainerでSubGizmoを使用することです。:-)

ただし、何らかの理由で直接それを行うことができない場合は、実行時にSubContainerを変更できます(class_addIvarまたはclass_addMethod、必要に応じて例を示します)が、Xcodeの警告を回避するのに役立ちません。

于 2012-04-30T05:37:30.477 に答える
-2

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

于 2012-04-30T06:05:00.783 に答える