假设我有两个基类,Container
和 Gizmo
。 Container
类有一个 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/