我有类“Character”,它是CCSprite的子类。 “Character”只有一个属性int“extraTag”。我正在使用方法getChildByTag:,它返回一个CCSprite转换为CCNode。我想做的是将它“演员”为“角色”。我知道将任何类转换为它的子类是不好的做法(并且无论如何都不会工作),所以我想知道是否有可能以某种方式将CCSprite更改为“Character”。 Obj-C中不存在函数重载,因此超出了可能性。
感谢任何帮助;谢谢。
PS:如果你想知道我为什么要为一个属性子类化“CCSprite”,那是因为我在“CCSprite”动画时使用“extraTag”进行存储。当我调用runAction:时,它会将“extraTag”设置为当前操作名称。我不想搞乱来自CCNode的现有“tag”属性,因为Cocos2D内部由于其他原因而处理它。如果这引起了红旗,请告诉我;我想尽可能避免不良做法! (:
答案 0 :(得分:2)
您可以将精灵包装在Character类中:
@interface Character {
CCSprite *sprite;
int actionTag;
}
- (void)runAction:(CCAction *)action;
@end
并在实施文件中:
- (void)runAction:(CCAction *)action{
actionTag = <action-name>;
[sprite runAction:action];
}
答案 1 :(得分:1)
如果我正确理解了你的目标,你希望将一个新属性添加到一个类的现有实例中 - 因此你想要定义一个子类并尝试“强制转换”错误的方法。正如已经指出的那样,你无法做到这一点。
将另一个具有所需新属性的类中的现有实例包装在一起会将您的两件事 - 属性和实例 - 绑定在一起,但作为您的包装类的一个实例,我认为这不是您的意思后。您可以使用包装器来实现您的目标 - 您使用属性和对现有类的引用来定义子类,并将方法转发到捕获的实例(即您构建代理),但是有点参与做到这一点。
那么Objective-C提供了什么来帮助您实现目标?
Objective-C支持 categories ,它允许您向现有类添加其他方法,从而添加现有类的所有实例。
但是你不想添加一个方法,你想要一个int
。但是,您可以定义int
属性 - 默认情况下,属性只有两种方法和一些存储空间(在您的情况下为int
)。该类别为您提供了方法,因此您只需要存储...
输入关联对象。 Objective-C支持将任意数量的对象与另一个对象相关联,每个关联的对象由唯一的键标识 - 有效的Objective-C为您提供关联对象的字典。一个对象为您提供存储......
所以大概你可以
a)声明一个具有int
属性的类 - 称之为MyAddedProperties
b)在CCSprite
上定义一个类别,比如MyAddedPropertiesCategory
,也提供您的int
媒体资源。手动实现此属性的setter和getter以查找MyAddedProperties
的关联实例并设置/获取其int
属性。
您已向现有类添加了属性!
(b)要求在第一次调用类别setter / getter时创建并关联MyAddedProperties
的实例,并为关联对象定义唯一键。你通过查找你的密钥来做前者,如果没有相关的对象创建一个。唯一键是void *
类型的任何值 - 即地址。获取唯一键的标准方法是在您的类别中声明static
变量(任何类型,只使用其地址),并在键入时使用其地址。
您可以阅读categories here和associated objects here。
这不是很多代码。如果您在编写解决方案时遇到问题,请提出一个新问题,提供您的代码以及出现的问题。
HTH