【Effective Objective-C 2.0 讀書筆記】第九條:以“類族模式”隱藏實(shí)現(xiàn)細(xì)節(jié)

第九條:以“類族模式”隱藏實(shí)現(xiàn)細(xì)節(jié)

“類族”(class cluster)是一種很有用的模式(pattern),可以隱藏“抽象基類”(abstract base class)背后的實(shí)現(xiàn)細(xì)節(jié)挺勿。

Objective-C的系統(tǒng)框架中普遍使用此模式默辨。

創(chuàng)建類族

首先定義抽象基類

每個(gè)“實(shí)體子類”(concrete subclass)都從基類繼承而來(lái)王暗。

Objective-C語(yǔ)言沒辦法指明某個(gè)基類是“抽象的”(abstract)健提。開發(fā)者通常會(huì)在文檔中寫明類的用法疏橄。這種情況下蝶怔,基類接口一般都沒有名為“init”的成員方法奶浦。

這暗示該類的實(shí)例也許不應(yīng)該由用戶直接創(chuàng)建。

Cocoa里的類族

大部分collection類都是類族踢星。

例如:

在使用NSArray的alloc方法來(lái)獲取實(shí)例時(shí)澳叉,該方法首先會(huì)分配一個(gè)屬于某類的實(shí)例,此實(shí)例充當(dāng)“占位數(shù)組”(placeholder array)沐悦。該數(shù)組稍后會(huì)轉(zhuǎn)為另一個(gè)類的實(shí)例成洗,而那個(gè)類則是NSArray的實(shí)體子類。

像NSArray這樣的類的背后其實(shí)是一個(gè)類族(對(duì)于大部分collection類而言都是這樣)

下面是一個(gè)錯(cuò)誤示例:

id maybeAnArray = /*?…*/;

if([maybeAnArray class] == [NSArray class]){

// will never be hit

}

知道了NSArray是一個(gè)類族藏否,就知道if語(yǔ)句永遠(yuǎn)不會(huì)為真

因?yàn)閇maybeAnArray class]所返回的類絕不可能是NSArray類本身瓶殃,因?yàn)橛蒒SArray的初始化方法所返回的那個(gè)實(shí)例其類型在類族公共接口(public facade)后面的某個(gè)內(nèi)部類型(internal type)。

不過(guò)仍有辦法可以判斷出某個(gè)實(shí)例所屬的類是否位于類族中副签。

使用類查詢方法(introspection method)

id maybeAnArray = /*…*/;

if([maybeAnArray isKindOfClass:[NSArray class]){

//will be hit

}

向類族中增加新子類遥椿,遵守規(guī)則:

1.子類應(yīng)該繼承自類族中的抽象基類

2.子類應(yīng)該定義自己的數(shù)據(jù)存儲(chǔ)方式(抽象基類只是包在其他隱藏對(duì)象外面的殼基矮,它僅僅定義了所有子類都需具備的一些接口)

3.子類應(yīng)當(dāng)覆寫超類文檔中指明需要覆寫的方法

【要點(diǎn)】

1.類族模式可以把實(shí)現(xiàn)細(xì)節(jié)隱藏在一套簡(jiǎn)單的公共接口后面

2.系統(tǒng)框架中經(jīng)常使用類族

3.從類族的公共抽象基類中繼承子類時(shí)要當(dāng)心,若有開發(fā)文檔修壕,則應(yīng)先閱讀

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末愈捅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子慈鸠,更是在濱河造成了極大的恐慌蓝谨,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件青团,死亡現(xiàn)場(chǎng)離奇詭異譬巫,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)督笆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門芦昔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人娃肿,你說(shuō)我怎么就攤上這事咕缎。” “怎么了料扰?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵凭豪,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我晒杈,道長(zhǎng)嫂伞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任拯钻,我火速辦了婚禮帖努,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘粪般。我一直安慰自己拼余,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布亩歹。 她就那樣靜靜地躺著姿搜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捆憎。 梳的紋絲不亂的頭發(fā)上舅柜,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音躲惰,去河邊找鬼致份。 笑死,一個(gè)胖子當(dāng)著我的面吹牛础拨,可吹牛的內(nèi)容都是我干的氮块。 我是一名探鬼主播绍载,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼滔蝉!你這毒婦竟也來(lái)了击儡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蝠引,失蹤者是張志新(化名)和其女友劉穎阳谍,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體螃概,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡矫夯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吊洼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片训貌。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖冒窍,靈堂內(nèi)的尸體忽然破棺而出递沪,到底是詐尸還是另有隱情,我是刑警寧澤综液,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布款慨,位于F島的核電站,受9級(jí)特大地震影響意乓,放射性物質(zhì)發(fā)生泄漏樱调。R本人自食惡果不足惜约素,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一届良、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧圣猎,春花似錦士葫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至欠啤,卻和暖如春荚藻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背洁段。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工应狱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人祠丝。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓疾呻,卻偏偏與公主長(zhǎng)得像除嘹,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子岸蜗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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