3 回答

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

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