使用超类'实例初始化对象

adu*_*ubr 17 inheritance copy initialization objective-c superclass

假设有一个Superclass这个类的实例superclassObject.
我创建了一个派生的ClassA.

如何classAObject以这种方式实例化(初始化)派生类的对象,所有继承的字段都等于superclassObject

当然,我可以循环遍历所有字段并手动复制值classAObject.property = [superclassObject.property copy].但是这种方法的问题在于我可能不知道(或无法访问)超类的所有ivars /属性.有更简单(更通用)的方式吗?

似乎我错过了一些非常基本的东西......

我正在尝试这样做,因为我得到了一个已经初始化的UIView(带框架,背景颜色,自动调整遮罩等),我想用我的自定义视图替换它具有相同的参数.

更新1

我发现了这个问题,那里的答案就是这么说的

通常不支持任何OO语言

然而

在Objective-C中,在某些情况下是可能的

好吧,如果它支持,我该怎么办?如果支持的,我怎么能做到这一点?

更新2

我似乎找到了解决这个一般问题的特殊情况的解决方案,我将在明天测试并报告.

然而,这引出了另一个想法:如果我使用NSCoder对其进行编码superclassObject(如果它<NSCoding>当然是实现的话),然后[[ClassA alloc] initWithCoder:coder]使用知道来自编码数据的编码器进行调用,该superclassObject怎么办?免责声明:嗯,我不熟悉编码概念(甚至根本不熟悉),所以可能最后一句话是胡说八道.

Tom*_*zak 0

使用 ObjC 运行时绝对是可能的,但它会有点麻烦......这是 Apple 文档的链接:Objective-C Runtime及其用法示例:Objective-C Runtime Planning

您将迭代所有属性,检查它们的属性以找出可以设置的属性(即省略只读属性),在超类上获取它们的 getter 方法,读取值并使用子类上的 setter 方法进行设置。

在 UIView 的特定情况下,这可能会起作用 - 您将进行调整直到它起作用。一般来说,这可能很困难:那些没有作为属性公开的 ivars 又如何呢?您想全部复制吗?然后,您需要检查类中定义的属性以及该类实现的所有协议。我不确定是否不需要迭代超类的所有超类来获取所有定义的属性和 ivars。

但是,这仍然是可能的。

更新

如果您要复制实例变量,那么您可能会在不接触属性的情况下进行设置 - 我假设所有状态最终都保存在 ivars 中。因此在这种情况下也不需要触及协议定义的属性。

但是另一个可能工作得很好的解决方案是只坚持公共接口(实际上是它的一部分:只是看起来是数据而不是功能):通过超类的属性读取数据并使用派生类的属性进行设置,再次假设类将对数据执行正确的操作。在这种情况下,协议属性同样重要,因为它们也是公共接口的一部分,并且它们的实现可以将状态保存到实例变量中。

再说一遍,我不会尝试将此方法作为复制任何类的通用解决方案,但在复制一个特定类的数据的情况下,它可能工作得足够好,并且您可以轻松彻底地测试您的案例。