4

假设我有两个基类,Container并且Gizmo. ClassContainer有一个实例变量 class Gizmo

现在我是子类Container(称为SubContainer),我也是子类GizmoSubGizmo)。在某些方法中,我需要向一些没有但SubContainer有的属性发送消息。有什么方法可以将 ivar 覆盖为in类,以便我可以发送这些消息?GizmoSubGizmoSubGizmoSubContainer

现在,我可以通过在SubGizmo每次需要使用此类属性或方法时将继承的 ivar 转换为它来使其工作。

这就是我想要这种行为的原因:我已经有一个可以运行的游戏,但是我添加的模式越多,它就越难维护。如果我想更改/添加将在每种模式下运行的方法;我需要去三个不同的游戏 - 控制器对象并进行更改。

通过子类化,我想将主要的游戏机制保留在基类中,并为每种模式创建一个子类。这样,我在基类中所做的更改将反映在每种模式上。然而,每个控制器和游戏对象都有针对不同模式的新方法,并且它们相互发送消息。这就是我的问题所在。

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

最简单的方法是在 Container 中使用 SubGizmo,而不是 Gizmo。:-)

但是,如果你因为某种原因不能直接这样做,你可以在运行时修改 SubContainer (寻找class_addIvaror class_addMethod,我可以在你需要的时候给你一个例子),但这无助于避免 Xcode 的警告。

于 2012-04-30T05:37:30.477 回答
-2

您可以使用 NSNotifications 向您的所有游戏控制器发送更新。

于 2012-04-30T06:05:00.783 回答