什么是抽象類
抽象類自身不生成實例,它是為了給所有繼承它的子類提供統(tǒng)一的接口而定義的。
在超類中,只描述接口和公共部分的定義。這樣在定義子類時,在子類中只聲明那些需要具體定義的方法,這樣的超類就是抽象類或者稱為虛類。
類簇
類簇的概念
類簇(class cluster)就是定義相同的接口并提供相同功能的一組類的集合。僅公開接口的抽象類也稱為類簇的公共類(public class)。各個具體類的接口由公共類的接口抽象化,并被隱藏在簇的內(nèi)部。這些具體類不能被直接使用,一般會作為公共類的子類來實現(xiàn),所以有時也稱他們?yōu)樗接凶宇悺?/p>
實際編寫代碼時,公共類和普通類按照同樣的方式使用,但是實際上被生成并存在在內(nèi)存上的實例是隱藏在類簇中的某個類的實例。因為可以正確執(zhí)行,所以程序幾乎意識不到這點差異。類簇有一個機(jī)制,可以從多個已存在的類中挑選出最適合當(dāng)前場景的類并且自動啟用。
ps:百度百科:
類簇 是一群隱藏在通用接口下的與實現(xiàn)相關(guān)的類,使得我們編寫的代碼可以獨立于底層實現(xiàn)(因為接口是穩(wěn)定的)。如創(chuàng)建NSString對象時,你得到的可能是NSLiteralString,NSCFString,NSSimpleCString等。即不同的NSString對象調(diào)用同一個接口A,接口A的實現(xiàn)可能是不同的
編程中的注意事項
OC中沒有專門構(gòu)成類簇的語法。一般情況下,公共類默認(rèn)為抽象類,而具體的類則是作為公共類的私有子類來實現(xiàn)。使用類簇時,不用在意和普通類的差別,但要注意以下兩點:
1.查看實例所屬的類時
對于類簇來說,所有的實例都是私有子類的實例,因此,從類簇的測試程序中我們可以看出,方法isMemberOfClass:即使是將公共類作為輸入?yún)?shù),也很難知道結(jié)果。
當(dāng)實例所屬類的處理策略被改變時,可以使用方法isKindOClass:判斷是否為子類實例,使用方法respondsToSelector:判斷是否為特定方法,這些方法都十分有效。
2.生成子類時
很多情況下,公共類作為抽象類被實現(xiàn)的時候,各個方法是在私有子類中具體實現(xiàn)的。因此,即便生成了直接繼承公共類的子類,也不能立即產(chǎn)生用戶想要的功能。
生成類簇的子類
類簇使多種類別實現(xiàn)抽象化,在公共類的外部只有類簇是可見的。下面說明一下如何產(chǎn)生基于擴(kuò)展或改變類簇功能的類。因為類簇目前是作為Foundation框架的基本類來實現(xiàn)的,所以一般情況下,沒有必要生成子類。
使用范疇
添加新的范疇可以擴(kuò)展公共類的功能,也可以實現(xiàn)實例變量那樣使用關(guān)聯(lián)引用的功能。
在公共類添加的范疇也會被類簇中隱藏的子類所繼承,所以類簇中所有的類都可以使用新添加的功能。
基本方法的重定義
類簇包含一小部分基本方法,其他方法都是在基本方法的基礎(chǔ)上實現(xiàn)的。基本方法在子類中實現(xiàn),而其他方法在公共類中實現(xiàn)。每個子類(私有類)中不同的實現(xiàn)細(xì)節(jié)都隱藏在基本方法中。也就是說,即使在類簇內(nèi)部,也實現(xiàn)了過程抽象化和信息隱藏。
因此,定義私有數(shù)據(jù)結(jié)構(gòu)及對其訪問的基本方法是為了類簇生成新的子類的最好方式。
下面具體說明類簇的子類的實現(xiàn)方法:
1.確定私有數(shù)據(jù)結(jié)構(gòu)
確定作為實例變量的數(shù)據(jù)結(jié)構(gòu),作為超類的類簇不能使用所有的數(shù)據(jù)結(jié)構(gòu)。
2.定義初始化方法
定義init...這樣的初始化方法。不能繼承和使用init之外的超類的初始化方法。只要沒有私有數(shù)據(jù)結(jié)構(gòu),就可以使用init,所以沒必要定義初始化方法。
3.定義便利構(gòu)造器
必要的話,以數(shù)據(jù)類型名作為前綴,定義生成臨時對象的類方法。不能繼承及使用超類的同樣的方法。
4.定義基本方法
定義自己的基本方法。
5.定義其他方法
通過定義基本方法,公共類聲明的方法可以暫且執(zhí)行,但是利用生成數(shù)據(jù)結(jié)構(gòu)的特征也許能夠產(chǎn)生更加高效的方法,而且也可以重寫這樣的方法。如果已經(jīng)在子類上單獨擴(kuò)展了功能,那么只要定義相應(yīng)的方法就可以。