[英]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.