2013-10-01 214 views
2

例如,我有这些类:是否可以更改具有不同Class的对象的Class类型?

  1. MyGradientButton.h/.M
  2. RedGradientButton.h/.M(继承MyGradientButton类与背景颜色红色)

现在,我一个具有MyGradientButton类特性的实例化对象“buttonA”。但是,是否有可能稍后将“buttonA”类更改为RedGradientButton,并获取这种新的类特性,将该按钮变为红色?

如果可能,让我知道如何。谢谢

+0

简短答案只是'NO'。 –

回答

3

不,你不能改变它创建后类的类型[1]。

最好的办法是创建一个克隆方法。在这种情况下,类变量通常是您消息的对象。

此表单的一个常见示例是:[NSString stringWithString:s]针对[NSMutableString stringWithString:s];

因为您正在处理视图,所以定义内部类型和使用对象组合通常更容易。所以你不会有RedGradientButton类型,而是一个MyGradientButton,它有(例如)characteristics成员。然后你可以创建多个特征类型(如果子类化真的是一个好设计)。


[1]您可能,但 ...如果有人告诉你如何可以实现。原因:这是不安全的,一种方法正在消失。尽管可以设置更新方法的类,但这样做不会修改对象的其他方面。显而易见的情况是,您的对象不会被调整大小或更新以反映成员布局中的任何差异,这意味着当您向对象发送消息并访问存在于子类中的成员而不是超类时,您的方法的实现将读取或写入无效的内存(这是未定义的行为)。即使它看起来有效,或者你已经动态地证明或做了一切你可以确保它是安全的,现代运行时使用一个非脆弱对象ABI--你的基类所需的内存可以从一个版本变为另一个版本。这种设计在调整大小(泄漏,无法引用的内存或内存'对类型转换'到另一个类的数据)时可能会遇到其他错误。所以,即使你克服了分配大小的问题,仍然需要设计一种方法来执行部分释放和部分初始化实例,使对象处于可用状态 - 这非常复杂。

+1

感谢您对贾斯汀的评论。 – Zaldy

2

无情的答案是:“是的,你可以”。 更明智的答案是:“不,你不应该这样做,除非你非常了解你在做什么,因此可以证明自己是否是个好主意”。

如果我是你,那么我会为箱状RedGradientButtion+(instancetype) redGradientButtonWithMyGradientButton:(MyGradientButton*)myGradientButton;

这种方法一个新的工厂方法可能再实例化一个新的RedGradientButton对象和复制的myGradientButton所有相关charachteristics。然后,如果您认为这是一个好主意,它可以获取myGradientButtons超级景观,将其从超级景观中移除并添加新的RedGradientButton对象而不是它。 当然这会使所有对myGradientButton的引用指向一个未使用的(但是仍然有效的ARC)Button对象。你将不得不更新它们。

你说RedGradientButton继承自MyGradientButton。这意味着所有使用MyGradientButton的类都应该继续正常工作 - 一旦参考文件被更新了,当然。

+0

谢谢你的评论赫尔曼。 – Zaldy

+0

不客气。 –

相关问题