B是A的子类。C是A的子类。当我创建c时,我在C中的.m内执行if((self = [NSKeyedUnarchiver unarchiveObjectWithFile:…])) { }
。
因此,尽管我将Ch中的 super class 设置为B(这就是我想要的),但是当我从unarchiveObjectWithFile:
创建C对象时,由于该对象是A的子类,所以我不能强迫它成为B的子类。解释抱歉)。
有什么解决方法吗?
换句话说:当我对属于类A的对象进行unarchiveObjectWithFile:…
编码,而我又有另一个类A的子类B时,unarchiveObjectWithFile:
可以作为B的子类吗? (因为B是a的子类,所以允许夹心)
最佳答案
如果我理解正确:否。
如果您存档B
实例,那么在取消存档时,您将获得B
实例,同样对于A
和C
实例。
但是,用非技术语言来说,子类是其 super class 的全部内容,外加一些额外的位。您不能[*]直接或通过存档创建 super class 的实例,并使其成为其子类之一的实例-“多余的位”不存在。
高温超导
[*]在有人评论之前:是的,并非在所有情况下都绝对正确,但是您正在进入晦涩,高度专业和危险的水域。不要去那
附录
似乎您属于安全更改类别的类别:您应该能够将实例的类别更改为子类,前提是该子类没有添加任何实例变量或属性。为此,您可以使用Objective-C runtime functions:
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
您也可以使用取消归档的类来设置类。
不要随便这样做。考虑替代方案,但有时它是一个合适的解决方案。
关于ios - Objective-C:强制一个类成为其他类的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22734625/