簡體   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