objective-c - 在子类中更改 ivar 的类(到派生类)

标签 objective-c ios inheritance subclass ivars

假设我有两个基类,ContainerGizmoContainer 类有一个 Gizmo 类的实例变量。

现在我将 Container 子类化(称为 SubContainer)并且我还将 Gizmo 子类化(SubGizmo)。在 SubContainer 的一些方法中,我需要向 Gizmo 没有但 SubGizmo 有的一些属性发送消息。有什么方法可以覆盖 SubContainer 中的 SubGizmo 类的 ivar,这样我就可以发送这些消息了吗?

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

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

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

最佳答案

只需使用如下方法介绍类型安全和转换逻辑:

@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

然而,逐渐增加的复杂性表明更多类型的变化值得考虑。

关于objective-c - 在子类中更改 ivar 的类(到派生类),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10378858/

相关文章:

ios - 如何根据条件在核心数据中插入数据

ios - 信号 R - 获取第二个参数

ios - 如何在键盘选择菜单中编辑自定义键盘名称

javascript - 从子原型(prototype)调用父原型(prototype)

c++ - 通过基类调用时,实现的虚方法调用失败

java - 适用于 iOS 的小数格式

objective-c - 为什么/什么时候应该使用静态声明变量?

ios - 我可以使用 CMake 为 XCode (OCUnit) 创建 iOS 单元测试目标吗?

iphone - UIButton 的触摸检测添加为 UIScrollView 中的 subview

c# - 如何使用可以处理整数或字符串值的泛型创建抽象基类?