用超类的实例初始化对象

| 假设a有一个
Superclass
和一个此类instance1ѭ的实例。 我创建一个派生的
ClassA
。 如何以这种方式实例化(初始化)派生类的对象
classAObject
,使所有继承的字段都等于ѭ1ones? 当然,我可以遍历所有字段并手动复制the5ѭ之类的值。但是这种方法的问题在于,我可能不知道(或无法访问)超类的所有ivars /属性。 有没有更简单(更通用)的方法? 看来我确实缺少一些基本的东西... 我正在尝试执行此操作,因为我已经初始化了UIView(具有框架,背景色,自动调整大小的蒙版等),并且希望将其替换为具有相同参数的自定义视图。 更新1 我找到了这个问题,那里的答案说   通常不支持任何OO语言 然而   在Objective-C中,某些情况下可能 好的,如果不支持该怎么办?如果支持,如何实现? 更新2 看来,我已经找到了解决这个一般问题的特定方法的解决方案,我将在明天对其进行测试和报告。 但是,这引出了另一个想法:如果我使用NSCoder来编码ѭ1(如果它实现了implement7),然后使用从已编码的ѭ1知道数据的编码器调用ѭ8call,该怎么办?免责声明:嗯,我不太熟悉编码概念(甚至根本不熟悉),所以最后一句话可能是胡说八道。     
已邀请:
如果我正确理解了该问题,则您已经建立了一个视图,您想将其更改为其他类。大概是因为更改了其功能。 在类和交换实例之间克隆类属性是在Java之类的语言中执行此类操作的唯一方法。 但是...在目标C中,我们有类别。如果您要尝试做的只是更改行为,那么可能的解决方案可能是为UIView创建类别,以执行所需的其他功能或替代功能。 第二个想法是研究为什么您首先没有创建正确的类,从而避免了整个问题。     
如果您的子类仅向超类添加方法,而没有添加任何存储(即ivars),则可以使用一种称为“ isa-swizzling \”的半魔术方法*。 Rob Napier提到了它,并链接到解释这一切的博客文章。 每个Objective-C实例在其内存中都有用于其实例变量的存储块,但是方法的实现都保存在类对象存储的另一个位置。运行时使用实例的“ 10”指针获取类对象。 因此,如链接的博客文章中所示,有可能将一个类的实例转换为另一个类,只要它们具有完全相同的字段。正如Rob所警告的那样,您不能添加ivars,只能更改方法。 强制转换11 has仅在编译时有效。它所做的只是使编译器在比较类型时感到高兴:它不影响方法的运行时查找,因此,您的
instanceOfSuperclass
仍然会像
Superclass
那样工作。 编辑:作为最后的想法,由于我们已经在讨论危险技术,所以也许您可以创建一个辅助类,其中包含要添加到子类中的ivars。哇,现在我真的发疯了! 我自己从来没有做过;我只是在报告一种可能对您有用的技术。讨论此问题时,请注意您看到的所有警告。 *有趣的是,用于KVO。     
绝对可以使用ObjC运行时,但这有点毛茸茸。。。这是指向Apple文档:Objective-C运行时的链接,以及它的用法示例:Objective-C运行时编程。 您将遍历所有属性,检查其属性以查找可以设置的属性(即省略只读属性),在超类上获取其getter方法,在子类上读取值并使用setter方法进行设置。 在UIView的特定情况下,这可能会起作用-您将对其进行调整,直到它起作用为止。通常,这可能很困难:未被显示为属性的ivars怎么办?是否要全部复制?然后,您需要检查在类中定义的属性以及该类实现的所有协议。而且我不确定是否不需要遍历您超类的所有超类来获取所有已定义的属性和ivars。 但是,仍然有可能。 更新 如果您要复制实例变量,则可能甚至没有接触属性就可以设置-我认为最终所有状态都保存在ivars中。因此,在这种情况下,也无需触摸协议定义的属性。 但是另一种可能效果很好的解决方案是仅坚持使用公共接口(实际上是它的一部分:看起来只是数据而不是功能):通过超类的属性读取数据,并使用派生类的属性进行设置,再次假设类将对数据执行正确的操作。在这种情况下,协议属性同样重要,因为协议属性也是公共接口的一部分,它们的实现可以将状态保存到实例变量中。 再说一次,我不会尝试这种方法作为复制任何类的通用解决方案,但是在复制一个特定类的数据的情况下,这种方法可能会很好地工作,并且您可以轻松而彻底地测试案例。     

要回复问题请先登录注册