iOS中分類和繼承的區(qū)別

? ? ? ? 在OC中,擴(kuò)展一個(gè)類的方式有兩種:繼承與分類。

? ? ? ? 繼承與分類最大的區(qū)別是,一般情況下,分類不能擴(kuò)展屬性,繼承可以擴(kuò)展屬性。但有一種情況下,分類可以擴(kuò)展屬性,那就是在本類中寫(xiě)的分類。

? ? ? ? ?這里解釋下,屬性與成員變量的關(guān)系。

? ? ? ? 屬性: 聲明一個(gè)屬性,則系統(tǒng)會(huì)默認(rèn)給生成讀取函數(shù)(set,get),可以通過(guò)點(diǎn)運(yùn)算符來(lái)默認(rèn)調(diào)用這個(gè)存取方法,并且會(huì)產(chǎn)生一個(gè)以_開(kāi)頭的成員變量。

? ? ? ? ?屬性就是與屬性相對(duì)應(yīng)的成員變量的值。在使用屬性的時(shí)候,其實(shí)本質(zhì)也是對(duì)成員變量的值進(jìn)行操作。

? ? ? ? ?成員變量:則是單純的一個(gè)變量,不會(huì)有連帶的存取方法。

? ? ? ? ?屬性是暴露在外面的,可以供外面進(jìn)行訪問(wèn)調(diào)用的。而成員變量默認(rèn)是protected的,保護(hù)的成員,如果被設(shè)置為public才允許外部對(duì)象調(diào)用,否則,是訪問(wèn)不到的。

? ? ? ? 現(xiàn)在回到繼承與分類的話題上來(lái)。。。

1.繼承Inherit

? ? ? ? 繼承是任何一個(gè)面向?qū)ο蟮恼Z(yǔ)言都有的特性。子類可以繼承父類的屬性與方法。

? ? ? ?有兩種情況下,必須需要使用繼承,而不能使用分類的。

? ? ? ? a. 當(dāng)需要擴(kuò)展的方法與原方法同名時(shí),并且需要調(diào)用父類的同名方法,則需要繼承。若此時(shí)使用分類,則分類的方法的實(shí)現(xiàn)會(huì)覆蓋原方法的實(shí)現(xiàn),不會(huì)訪問(wèn)到原方法。

? ? ? ? b. 當(dāng)需要擴(kuò)展屬性時(shí)。

2. 類別:

? ? ? ? 這是OC特有的屬性,可以在不改變類名和原類的實(shí)現(xiàn)的前提下,進(jìn)行類的擴(kuò)展。

? ? ? ?以下幾種情況,最好使用分類:

? ? ?a. 針對(duì)系統(tǒng)的一些類進(jìn)行擴(kuò)展。例如,NSString, NSArray, NSNumber等類,系統(tǒng)本身不提倡使用繼承去擴(kuò)展方法,因?yàn)檫@些類內(nèi)部實(shí)現(xiàn)對(duì)繼承有所限制,所以最好用分類的方式擴(kuò)展。

? ? ? ? b.類別支持開(kāi)發(fā)人員針對(duì)自己構(gòu)建的類,把相關(guān)的方法分組到多個(gè)單獨(dú)的文件中,針對(duì)大型而復(fù)雜的類,可以提高維護(hù)性和可讀性,并簡(jiǎn)化單個(gè)源文件的管理。


? ? ?ps: 類別形式的擴(kuò)展還分為Category 和 Extension.在Xcode中創(chuàng)建文件時(shí),這兩種文件被區(qū)分開(kāi)來(lái)了。

? ? ? ? ? ?Category與Extension的區(qū)別:

? ? ? ? ? 1. Extension 是匿名的Category。

? ? ? ? 2. Extension 定義的方法,須在類的implement 中實(shí)現(xiàn),而category不強(qiáng)求。

? ? ? ? 3. Extension可以定義屬性,而Category不能定義屬性。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容