繁体   English   中英

Objective-C:强制某个类成为其他类的子类

[英]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的实例,对于AC实例也是如此。

但是,用非技术语言来说,子类是其超类的全部内容, 外加一些额外的位。 您不能[*]直接或通过存档创建超类的实例,并使其成为其子类之一的实例-“多余的位”不存在。

高温超导

[*]在有人评论之前:是的,并非在所有情况下都绝对正确,但是您正在进入晦涩,高度专业和危险的水域。 不要去那

附录

似乎您属于安全更改类别的类别:您应该能够将实例的类别更改为子类, 前提是该子类未添加任何实例变量或属性。 为此,您可以使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM