第十一章 抽象類

weixin_34377065發表於2017-12-13

什麼是抽象類

抽象類自身不生成例項,它是為了給所有繼承它的子類提供統一的介面而定義的。

在超類中,只描述介面和公共部分的定義。這樣在定義子類時,在子類中只宣告那些需要具體定義的方法,這樣的超類就是抽象類或者稱為虛類。

類簇

類簇的概念

類簇(class cluster)就是定義相同的介面並提供相同功能的一組類的集合。僅公開介面的抽象類也稱為類簇的公共類(public class)。各個具體類的介面由公共類的介面抽象化,並被隱藏在簇的內部。這些具體類不能被直接使用,一般會作為公共類的子類來實現,所以有時也稱他們為私有子類。

實際編寫程式碼時,公共類和普通類按照同樣的方式使用,但是實際上被生成並存在在記憶體上的例項是隱藏在類簇中的某個類的例項。因為可以正確執行,所以程式幾乎意識不到這點差異。類簇有一個機制,可以從多個已存在的類中挑選出最適合當前場景的類並且自動啟用。

ps:百度百科:

類簇 是一群隱藏在通用介面下的與實現相關的類,使得我們編寫的程式碼可以獨立於底層實現(因為介面是穩定的)。如建立NSString物件時,你得到的可能是NSLiteralString,NSCFString,NSSimpleCString等。即不同的NSString物件呼叫同一個介面A,介面A的實現可能是不同的

程式設計中的注意事項

OC中沒有專門構成類簇的語法。一般情況下,公共類預設為抽象類,而具體的類則是作為公共類的私有子類來實現。使用類簇時,不用在意和普通類的差別,但要注意以下兩點:

1.檢視例項所屬的類時

對於類簇來說,所有的例項都是私有子類的例項,因此,從類簇的測試程式中我們可以看出,方法isMemberOfClass:即使是將公共類作為輸入引數,也很難知道結果。

當例項所屬類的處理策略被改變時,可以使用方法isKindOClass:判斷是否為子類例項,使用方法respondsToSelector:判斷是否為特定方法,這些方法都十分有效。

2.生成子類時

很多情況下,公共類作為抽象類被實現的時候,各個方法是在私有子類中具體實現的。因此,即便生成了直接繼承公共類的子類,也不能立即產生使用者想要的功能。

生成類簇的子類

類簇使多種類別實現抽象化,在公共類的外部只有類簇是可見的。下面說明一下如何產生基於擴充套件或改變類簇功能的類。因為類簇目前是作為Foundation框架的基本類來實現的,所以一般情況下,沒有必要生成子類。

使用範疇

新增新的範疇可以擴充套件公共類的功能,也可以實現例項變數那樣使用關聯引用的功能。

在公共類新增的範疇也會被類簇中隱藏的子類所繼承,所以類簇中所有的類都可以使用新新增的功能。

基本方法的重定義

類簇包含一小部分基本方法,其他方法都是在基本方法的基礎上實現的。基本方法在子類中實現,而其他方法在公共類中實現。每個子類(私有類)中不同的實現細節都隱藏在基本方法中。也就是說,即使在類簇內部,也實現了過程抽象化和資訊隱藏。

因此,定義私有資料結構及對其訪問的基本方法是為了類簇生成新的子類的最好方式。

下面具體說明類簇的子類的實現方法:

1.確定私有資料結構

確定作為例項變數的資料結構,作為超類的類簇不能使用所有的資料結構。

2.定義初始化方法

定義init...這樣的初始化方法。不能繼承和使用init之外的超類的初始化方法。只要沒有私有資料結構,就可以使用init,所以沒必要定義初始化方法。

3.定義便利構造器

必要的話,以資料型別名作為字首,定義生成臨時物件的類方法。不能繼承及使用超類的同樣的方法。

4.定義基本方法

定義自己的基本方法。

5.定義其他方法

通過定義基本方法,公共類宣告的方法可以暫且執行,但是利用生成資料結構的特徵也許能夠產生更加高效的方法,而且也可以重寫這樣的方法。如果已經在子類上單獨擴充套件了功能,那麼只要定義相應的方法就可以。

相關文章