如果我正确理解您的目标,您希望将新属性添加到类的现有实例中 - 因此您定义子类并尝试以错误方式“转换”的想法。正如已经指出的那样,您不能这样做。
将现有实例包装在另一个具有所需新属性的类中会将您的两件事 - 属性和实例 - 绑定在一起,但作为包装类的实例,我认为这不是您所追求的。您可以使用包装器来实现您的目标 - 您定义一个具有属性和对现有类的引用的子类,并将方法转发到您捕获的实例(即您构建一个代理),但它有点涉及这样做。
那么,Objective-C 提供了什么来帮助您实现目标呢?
Objective-C 支持类别,允许您向现有类添加其他方法,从而为现有类的所有实例添加其他方法。
但是你不想添加一个方法,你想要一个 an int
。但是,您可以定义一个int
属性- 默认情况下,一个属性只是两个方法和一些存储(在您的情况下为int
)。类别为您提供方法,因此您只需要存储...
输入关联对象。Objective-C 支持将任意数量的对象与另一个对象关联,每个关联的对象都由一个唯一的键标识 - 实际上,Objective-C 为您提供了关联对象的字典。一个对象给你存储...
所以在大纲中你可以
a)声明一个具有int
属性的类 - 称它为MyAddedProperties
b) 在 上定义一个类别CCSprite
,例如MyAddedPropertiesCategory
,也提供您的int
属性。手动实现此属性的 setter 和 getter 以查找和关联实例MyAddedProperties
并设置/获取其int
属性。
您已将属性添加到现有类!
(b) 需要MyAddedProperties
在第一次调用类别 setter/getter 时创建和关联实例,并为关联对象定义唯一键。您通过查找您的密钥来执行前者,如果没有关联的对象,请创建一个。唯一键是任何类型的值void *
- 即地址。获得唯一键的标准方法是static
在您的类别中声明一个变量(任何类型,只使用其地址)并将其地址用作键。
您可以在此处阅读有关类别和相关对象的信息。
这不是很多代码。如果您在编写解决方案时遇到问题,请提出一个新问题,给出您的代码以及出了什么问题。
高温高压