2013-10-01 215 views
2

例如,我有這些類:是否可以更改具有不同Class的對象的Class類型?

  1. MyGradientButton.h/.M
  2. RedGradientButton.h/.M(繼承MyGradientButton類與背景顏色紅色)

現在,我一個具有MyGradientButton類特性的實例化對象「buttonA」。但是,是否有可能稍後將「buttonA」類更改爲RedGradientButton,並獲取這種新的類特性,將該按鈕變爲紅色?

如果可能,讓我知道如何。謝謝

+0

簡短答案只是'NO'。 –

回答

3

不,你不能改變它創建後類的類型[1]。

最好的辦法是創建一個克隆方法。在這種情況下,類變量通常是您消息的對象。

此表單的一個常見示例是:[NSString stringWithString:s]針對[NSMutableString stringWithString:s];

因爲您正在處理視圖,所以定義內部類型和使用對象組合通常更容易。所以你不會有RedGradientButton類型,而是一個MyGradientButton,它有(例如)characteristics成員。然後你可以創建多個特徵類型(如果子類化真的是一個好設計)。


[1]您可能,但 ...如果有人告訴你如何可以實現。原因:這是不安全的,一種方法正在消失。儘管可以設置更新方法的類,但這樣做不會修改對象的其他方面。顯而易見的情況是,您的對象不會被調整大小或更新以反映成員佈局中的任何差異,這意味着當您向對象發送消息並訪問存在於子類中的成員而不是超類時,您的方法的實現將讀取或寫入無效的內存(這是未定義的行爲)。即使它看起來有效,或者你已經動態地證明或做了一切你可以確保它是安全的,現代運行時使用一個非脆弱對象ABI--你的基類所需的內存可以從一個版本變爲另一個版本。這種設計在調整大小(泄漏,無法引用的內存或內存'對類型轉換'到另一個類的數據)時可能會遇到其他錯誤。所以,即使你克服了分配大小的問題,仍然需要設計一種方法來執行部分釋放和部分初始化實例,使對象處於可用狀態 - 這非常複雜。

+1

感謝您對賈斯汀的評論。 – Zaldy

2

無情的答案是:「是的,你可以」。 更明智的答案是:「不,你不應該這樣做,除非你非常瞭解你在做什麼,因此可以證明自己是否是個好主意」。

如果我是你,那麼我會爲箱狀RedGradientButtion+(instancetype) redGradientButtonWithMyGradientButton:(MyGradientButton*)myGradientButton;

這種方法一個新的工廠方法可能再實例化一個新的RedGradientButton對象和複製的myGradientButton所有相關charachteristics。然後,如果您認爲這是一個好主意,它可以獲取myGradientButtons超級景觀,將其從超級景觀中移除並添加新的RedGradientButton對象而不是它。 當然這會使所有對myGradientButton的引用指向一個未使用的(但是仍然有效的ARC)Button對象。你將不得不更新它們。

你說RedGradientButton繼承自MyGradientButton。這意味着所有使用MyGradientButton的類都應該繼續正常工作 - 一旦參考文件被更新了,當然。

+0

謝謝你的評論赫爾曼。 – Zaldy

+0

不客氣。 –

相關問題