在類簇中創(chuàng)建子類
類簇架構(gòu)是具有簡潔性和可擴(kuò)展性之間的一個(gè)折衷。用幾個(gè)公共類代表多個(gè)私有類可以使框架中的類易學(xué)易用,但是在某種程度上增加創(chuàng)建類簇子類的難度。然而如果很少需要?jiǎng)?chuàng)建子類,則類簇架構(gòu)則有明確的好處。Foundation框架只在這種情況下使用類簇。
如果您發(fā)現(xiàn)某個(gè)類簇沒有提供您的程序需要的功能,則可能適合引入一個(gè)子類。舉例來說,假定您希望創(chuàng)建一個(gè)數(shù)組對(duì)象,其存儲(chǔ)是基于文件的,而不是如NSArray類簇那樣是基于內(nèi)存的。由于您需要改變類的存儲(chǔ)機(jī)制,所以需要?jiǎng)?chuàng)建子類。
另一方面,在某些情況下可能定義一個(gè)擁有類簇對(duì)象的類就夠了(而且更加容易)。假定您的程序需要在某些數(shù)據(jù)被修改的時(shí)候得到通知,則為Foundation框架中定義的數(shù)據(jù)對(duì)象創(chuàng)建一個(gè)簡單的包裝類可能是最好的方法。該類的對(duì)象可以干預(yù)修改數(shù)據(jù)的消息,將它截獲并進(jìn)行必要的動(dòng)作,然后再轉(zhuǎn)發(fā)給嵌入的數(shù)據(jù)對(duì)象。
總的來說,如果您需要管理對(duì)象的存儲(chǔ),就創(chuàng)建一個(gè)真的子類。否則,就創(chuàng)建一個(gè)合成對(duì)象,即將標(biāo)準(zhǔn)的Foundation框架對(duì)象嵌入到您自己設(shè)計(jì)的對(duì)象中。
類簇的概念
類簇 是一群隱藏在通用接口下的與實(shí)現(xiàn)相關(guān)的類,使得我們編寫的代碼可以獨(dú)立于底層實(shí)現(xiàn)(因?yàn)榻涌谑欠€(wěn)定的)。
如創(chuàng)建NSString對(duì)象時(shí),你得到的可能是NSLiteralString,NSCFString,NSSimpleCString等。即不同的NSString對(duì)象調(diào)用同一個(gè)接口A,接口A的實(shí)現(xiàn)可能是不同的。
在Foundation框架中,常見的類簇有NSString,NSArray,NSDictionary等。想要在類簇中創(chuàng)建子類會(huì)困難一些,必須是抽象超類的子類,必須重載超類的原始方法,必須聲明自己的數(shù)據(jù)存儲(chǔ)。最方便的是使用組合或者類別來代替子類化。
類簇架構(gòu)代表一個(gè)反映簡單概念的設(shè)計(jì)。
類簇中的抽象超類必須聲明創(chuàng)建其私有子類的方法。根據(jù)調(diào)用的創(chuàng)建方法分配正確類型的對(duì)象是超類的責(zé)任。在Foundation框架中,通常通過調(diào)用+ className...或alloc...和init...方法來創(chuàng)建對(duì)象。以Foundation框架的NSNumber類為例,可以發(fā)送如下的消息來創(chuàng)建數(shù)字對(duì)象:
NSNumber *aChar = [NSNumber numberWithChar:’a’]; |
NSNumber *anInt = [NSNumber numberWithInt:1]; |
NSNumber *aFloat = [NSNumber numberWithFloat:1.0]; |
NSNumber *aDouble = [NSNumber numberWithDouble:1.0]; |