adu*_*ubr 17 inheritance copy initialization objective-c superclass
假设有一个Superclass这个类的实例superclassObject.
我创建了一个派生的ClassA.  
如何classAObject以这种方式实例化(初始化)派生类的对象,所有继承的字段都等于superclassObject?  
当然,我可以循环遍历所有字段并手动复制值classAObject.property = [superclassObject.property copy].但是这种方法的问题在于我可能不知道(或无法访问)超类的所有ivars /属性.有更简单(更通用)的方式吗?
似乎我错过了一些非常基本的东西......
我正在尝试这样做,因为我得到了一个已经初始化的UIView(带框架,背景颜色,自动调整遮罩等),我想用我的自定义视图替换它具有相同的参数.
我发现了这个问题,那里的答案就是这么说的
通常不支持任何OO语言
然而
在Objective-C中,在某些情况下是可能的
好吧,如果它不支持,我该怎么办?如果是支持的,我怎么能做到这一点?
我似乎找到了解决这个一般问题的特殊情况的解决方案,我将在明天测试并报告.
然而,这引出了另一个想法:如果我使用NSCoder对其进行编码superclassObject(如果它<NSCoding>当然是实现的话),然后[[ClassA alloc] initWithCoder:coder]使用知道来自编码数据的编码器进行调用,该superclassObject怎么办?免责声明:嗯,我不熟悉编码概念(甚至根本不熟悉),所以可能最后一句话是胡说八道.
使用 ObjC 运行时绝对是可能的,但它会有点麻烦......这是 Apple 文档的链接:Objective-C Runtime及其用法示例:Objective-C Runtime Planning。
您将迭代所有属性,检查它们的属性以找出可以设置的属性(即省略只读属性),在超类上获取它们的 getter 方法,读取值并使用子类上的 setter 方法进行设置。
在 UIView 的特定情况下,这可能会起作用 - 您将进行调整直到它起作用。一般来说,这可能很困难:那些没有作为属性公开的 ivars 又如何呢?您想全部复制吗?然后,您需要检查类中定义的属性以及该类实现的所有协议。我不确定是否不需要迭代超类的所有超类来获取所有定义的属性和 ivars。
但是,这仍然是可能的。
更新
如果您要复制实例变量,那么您可能会在不接触属性的情况下进行设置 - 我假设所有状态最终都保存在 ivars 中。因此在这种情况下也不需要触及协议定义的属性。
但是另一个可能工作得很好的解决方案是只坚持公共接口(实际上是它的一部分:只是看起来是数据而不是功能):通过超类的属性读取数据并使用派生类的属性进行设置,再次假设类将对数据执行正确的操作。在这种情况下,协议属性同样重要,因为它们也是公共接口的一部分,并且它们的实现可以将状态保存到实例变量中。
再说一遍,我不会尝试将此方法作为复制任何类的通用解决方案,但在复制一个特定类的数据的情况下,它可能工作得足够好,并且您可以轻松彻底地测试您的案例。
| 归档时间: | 
 | 
| 查看次数: | 3627 次 | 
| 最近记录: |