3 回答

TA貢獻1846條經驗 獲得超7個贊
盡管Object-C語言目前允許您使用類別來覆蓋類繼承的方法,即使是類接口中聲明的方法,也強烈建議您不要這樣做。..類別不能代替子類。使用類別覆蓋方法有幾個重大缺點:
當類別覆蓋繼承的方法時,類別中的方法可以像往常一樣通過消息調用繼承的實現
super
..然而,如果類別覆蓋類別的類中存在的方法,則無法調用原始實現.類別不能可靠地覆蓋同一類的另一個類別中聲明的方法。
這個問題特別重要,因為許多Cocoa類都是使用類別實現的。您試圖覆蓋的框架定義方法本身可能已在類別中實現,因此未定義優先實現。
某些類別方法的存在可能導致跨所有框架的行為更改。例如,如果您覆蓋
windowWillClose:
在NSObject上的類別中,程序中的所有窗口委托都使用類別方法進行響應;NSWindow的所有實例的行為可能會發生變化。在框架類中添加的類別可能會導致行為上的神秘變化,并導致崩潰。

TA貢獻1817條經驗 獲得超6個贊
避免類別方法名稱沖突
因為在類別中聲明的方法被添加到現有的類中,所以您需要非常小心地處理方法名稱。
如果在類別中聲明的方法的名稱與原始類中的方法相同,或同一類(甚至是超類)上的另一個類別中的方法相同,則未定義在運行時使用哪種方法實現的行為。如果您在自己的類中使用類別,這就不太可能成為問題,但是當使用類別將方法添加到標準Cocoa或CocoaTouch類時可能會導致問題。
這是蘋果使用的更輕的觸摸,但要點是一樣的:你招致災難,因為不可預測的行為是沉默的。
- 3 回答
- 0 關注
- 662 瀏覽
添加回答
舉報