Objective c 在子类中更改ivar的类(到派生类)
假设我有两个基类,Objective c 在子类中更改ivar的类(到派生类),objective-c,ios,inheritance,subclass,ivars,Objective C,Ios,Inheritance,Subclass,Ivars,假设我有两个基类,Container和Gizmo。ClassContainer具有ClassGizmo的实例变量 现在,我为容器(称之为子容器)创建子类,并且为小控件(子控件)创建子类。在subcainer的某些方法中,我需要向Gizmo没有但SubGizmo有的某些属性发送消息。是否有任何方法将ivar覆盖为子容器中的类子Gizmo,以便我可以发送这些消息 现在,每当我需要使用这样的属性或方法时,我都可以通过将继承的ivar强制转换到子Gizmo来实现 这就是我想要这样一种行为的原因:我已经有
Container
和Gizmo
。ClassContainer
具有ClassGizmo
的实例变量
现在,我为容器
(称之为子容器
)创建子类,并且为小控件
(子控件
)创建子类。在subcainer
的某些方法中,我需要向Gizmo
没有但SubGizmo
有的某些属性发送消息。是否有任何方法将ivar覆盖为子容器
中的类子Gizmo
,以便我可以发送这些消息
现在,每当我需要使用这样的属性或方法时,我都可以通过将继承的ivar强制转换到子Gizmo
来实现
这就是我想要这样一种行为的原因:我已经有了一款可以运行的游戏,但是我添加的模式越多,维护起来就越困难。如果我想更改/添加将在每个模式上运行的方法;我需要转到三个不同的游戏控制器对象并进行更改
通过子类化,我希望将主要的游戏机制保留在基类中,并为每个模式创建一个子类。这样,我在基类中所做的更改将反映在每个模式上。然而,每个控制器和游戏对象都有针对不同模式的新方法,它们相互发送消息。这就是我的问题所在。最简单的方法是在容器中使用子Gizmo,而不是Gizmo.:-)
但是,如果由于某种原因无法直接执行此操作,则可以在运行时修改Subcainer(查找
class\u addIvar
或class\u addMethod
,我可以在需要时为您提供一个示例),但这无助于避免Xcode的警告。只需为ivar使用类型id,您只需包含适当的头文件以避免警告 您可以使用NSNotifications向所有游戏控制器发送更新。只需使用以下方法引入类型安全和转换逻辑:
@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
然而,逐渐增加的复杂性表明,类型的更多变化是值得考虑的。一个程序就不会那么含糊不清了。我很高兴你似乎赞同我的类名;字母加上一些星星对我来说太难了@JacquesCousteau更清楚:)您不能在运行时将ivar添加到现有类中,类\u addIvar仅适用于未注册的类。您可以使用objc_setAssociatedObjectthough@Matthias是的,但我希望A(A***)的另一个子类有另一个属于B(B***)的另一个子类的实例,你知道我在哪里吗getting@JoshuaWeinberg:当然可以,但我知道OP可以控制子类。当我尝试使用点符号访问属性时,OP不起作用。我想每次访问基类没有的东西时,我都会坚持对想要的子类进行强制转换。。不管怎样,谢谢你的帮助这很好,我看到我能做的另一件事是做SubGizmo*subg=(SubGizmo*)gizmo;在每个将发送此类消息的方法的开始处。。我认为他们做的几乎是一样的,而你的更全球化。@Kaan-yup,当它在多个地方使用时,它减少了很多噪音,减少了你在改变时必须做的改变的数量。