Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在子类中更改ivar的类(到派生类)_Objective C_Ios_Inheritance_Subclass_Ivars - Fatal编程技术网

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
。Class
Container
具有Class
Gizmo
的实例变量

现在,我为
容器
(称之为
子容器
)创建子类,并且为
小控件
子控件
)创建子类。在
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,当它在多个地方使用时,它减少了很多噪音,减少了你在改变时必须做的改变的数量。