第十一章 抽象類

什么是抽象類

抽象類自身不生成實例,它是為了給所有繼承它的子類提供統(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)的方法就可以。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,767評論 18 399
  • 設(shè)計模式匯總 一、基礎(chǔ)知識 1. 設(shè)計模式概述 定義:設(shè)計模式(Design Pattern)是一套被反復(fù)使用、多...
    MinoyJet閱讀 3,982評論 1 15
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,982評論 19 139
  • 一:java概述:1,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境,java的開發(fā)工...
    ZaneInTheSun閱讀 2,688評論 0 11
  • 老廖的形象問題這幾十年的老大難,很多朋友,同事,領(lǐng)導(dǎo),包括我自己都很無奈。 你身材不錯,能不能穿得稍微好點?! 心...
    9444e0643fbd閱讀 202評論 1 6