[英]Objective-C: Force a class to be a subclass of other
B是A的子类。C是A的子类。当我创建ci时,请在C中的.m内执行if((self = [NSKeyedUnarchiver unarchiveObjectWithFile:…])) { }
。
因此,尽管我将Ch中的超类设置为B(这就是我想要的),但是当我从unarchiveObjectWithFile:
创建C对象时unarchiveObjectWithFile:
由于此对象是A的子类,所以我不能强迫它成为B的子类。很难解释抱歉。
有什么解决方法吗?
换句话说:当我unarchiveObjectWithFile:…
属于一个类A的对象,而我又有另一个类B是A的子类时, unarchiveObjectWithFile:
可以成为B的子类吗? (因为B是a的子类,所以允许夹心)
如果我理解正确:否。
如果归档B
的实例,则在取消归档时会得到B
的实例,对于A
和C
实例也是如此。
但是,用非技术语言来说,子类是其超类的全部内容, 外加一些额外的位。 您不能[*]直接或通过存档创建超类的实例,并使其成为其子类之一的实例-“多余的位”不存在。
高温超导
[*]在有人评论之前:是的,并非在所有情况下都绝对正确,但是您正在进入晦涩,高度专业和危险的水域。 不要去那
附录
似乎您属于安全更改类别的类别:您应该能够将实例的类别更改为子类, 前提是该子类未添加任何实例变量或属性。 为此,您可以使用Objective-C运行时函数 :
id obj = ... some instance of class A
object_setClass(obj, [B class]); // where B is a subclass of A which adds no properties or variables
您也可以使用取消归档的类来设置类。
不要随便这样做。 考虑替代方案,但有时它是一个合适的解决方案。
取消存档的人想要创建以前存档过的相同类型的类,这通常也是您想要的。
您可以看看使用setClass:forClassName:
来更改将要取消归档的类,但是您早晚有可能毁掉所有内容。
基于粒子注释:
另一种选择是获取超类实例并将其“包装”在您的子类实例中。 因此,您可以存档和取消存档您的子类实例,它将包含超类实例。 您的子类没有直接响应的任何方法都可以转发到超类实例。
这样,您就有2个对象,但是您不会篡改任何东西,也不会依赖于您不拥有的类的实现细节。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.