




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Objective-C-2.0程序設(shè)計(jì)-第11章-分類和協(xié)議第第11章章 分類和協(xié)議分類和協(xié)議第第11章章 分類和協(xié)議分類和協(xié)議合成對象11.3協(xié)議11.2分類11.111.1 分類 有時(shí)候在處理類定義時(shí),可能想要為其添加一些新方法。實(shí)用解決方案是:分類。分類提供了一種簡單的方式,用它可以將類的定義模塊化到相關(guān)方法的組或分類中。它還提供了擴(kuò)展現(xiàn)有類定義的簡便方式,并且不必訪問類的源代碼,也無需創(chuàng)建子類。分類是一個功能強(qiáng)大且簡單的概念。 首先展示如何為Fraction類添加新分類,以處理基本的四則數(shù)學(xué)運(yùn)算。首先,展示原始的Fraction接口部分:#import #import / Define
2、 the Fraction classinterface Fraction : NSObjectproperty int numerator, denominator;-(void) setTo: (int) n over: (int) d;-(Fraction *) add: (Fraction *) f;-(void) reduce;-(double) convertToNum;-(void) print;end11.1 分類 然后從接口部分刪除add:方法,并將其添加到新分類,同時(shí)添加其他三種要實(shí)現(xiàn)的數(shù)學(xué)運(yùn)算。新MathOps分類的接口部分應(yīng)該如下所示:#import “Fraction
3、.h”interface Fraction (MathOps)-(Fraction *) add: (Fraction *) f;-(Fraction *) mul: (Fraction *) f;-(Fraction *) sub: (Fraction *) f;-(Fraction *) div: (Fraction *) f;end 注意,這既是接口部分的定義,也是現(xiàn)有接口部分的擴(kuò)展。因此,必須包括原始接口部分,這樣編譯器就知道Fraction類。 在#import之后,有下面這一行:interface Fraction (MathOps)告訴編譯器你正在為Fraction類定義新的分類
4、,而且它的名稱為MathOps。注意此處沒有列出Fraction的父類,因?yàn)榫幾g器已從中知道此內(nèi)容。11.1 分類 可以將所有方法的定義放在一個實(shí)現(xiàn)部分。也就是,可以在一個實(shí)現(xiàn)文件中定義接口部分中的所有方法,以及MathOps分類中的所有方法?;蛘咴趩为?dú)的實(shí)現(xiàn)部分定義分類的方法。在這種情況下,這些方法的實(shí)現(xiàn)部分還必須找出方法所屬的分類。與接口部分一樣通過將分類名稱包括在類名稱之后的圓括號中來確定方法所屬的分類,如下所示:implementation Fraction (MathOps)/ code for category methods.end 在代碼清單11-1中,新的MathOps分類的
5、接口和實(shí)現(xiàn)部分組合在一起,連同測試?yán)潭挤旁谝粋€文件中。11.1 分類 代碼清單11-1-#import “Fraction.h”interface Fraction (MathOps)-(Fraction *) add: (Fraction *) f;-(Fraction *) mul: (Fraction *) f;-(Fraction *) sub: (Fraction *) f;-(Fraction *) div: (Fraction *) f;end11.1 分類implementation Fraction (MathOps)-(Fraction *) add: (Fraction
6、 *) f/ To add two fractions:/ a/b + c/d = (a*d) + (b*c) / (b * d)Fraction *result = Fraction alloc init;int resultNum, resultDenom;resultNum = (numerator * f.denominator) +(denominator * f.numerator);resultDenom = denominator * f.denominator;result setTo: resultNum over: resultDenom;return result;11
7、.1 分類-(Fraction *) sub: (Fraction *) f/ To sub two fractions:/ a/b - c/d = (a*d) - (b*c) / (b * d)Fraction *result = Fraction alloc init;int resultNum, resultDenom;resultNum = (numerator * f.denominator) -(denominator * f.numerator);resultDenom = denominator * f.denominator;result setTo: resultNum o
8、ver: resultDenom;return result;11.1 分類-(Fraction *) mul: (Fraction *) fFraction *result = Fraction alloc init;over: denominator * f.denominator;return result;-(Fraction *) div: (Fraction *) fFraction *result = Fraction alloc init;over: denominator * f.numerator;return result;end11.1 分類int main (int
9、argc, char *argv)NSAutoreleasePool * pool = NSAutoreleasePool alloc init;Fraction *a = Fraction alloc init;Fraction *b = Fraction alloc init;Fraction *result;a setTo: 1 over: 3;b setTo: 2 over: 5;a print; NSLog (” +”); b print; NSLog (”-”);result = a add: b;result print;NSLog (”n”);result release;11
10、.1 分類a print; NSLog (” -”); b print; NSLog (”-”);result = a sub: b;result print;NSLog (”n”);result release;a print; NSLog (” *”); b print; NSLog (”-”);result = a mul: b;result print;NSLog (”n”);result release;a print; NSLog (” /”); b print; NSLog (”-”);result = a div: b;result print;NSLog (”n”);resu
11、lt release;a release;b release;pool drain;return 0;11.1 分類 再次注意,以下語句在Objective-C語言中是合法的:a div: b print;在代碼清單11-1中有這項(xiàng)操作,但需要執(zhí)行這個中間賦值,這樣可以獲得結(jié)果Fraction,并隨后釋放它的內(nèi)存,否則,每次對分?jǐn)?shù)執(zhí)行數(shù)學(xué)運(yùn)算,程序都會泄露一些內(nèi)存。關(guān)于分類的一些注意事項(xiàng) 首先,盡管分類可以訪問原始類的實(shí)例變量,但是它不能添加自身的任何變量。如果需要添加變量,可以考慮創(chuàng)建子類。 另外,分類可以重載該類中的另一個方法,但是通常認(rèn)為這種做法是拙劣的設(shè)計(jì)習(xí)慣。其一,重載了一個方法之后
12、,再也不能訪問原來的方法。因此,必須小心地將被重載方法中的所有功能賦值到替換方法中。如果確實(shí)需要重載,正確的選擇可能是創(chuàng)建子類。 如果喜歡,可以擁有許多分類,只要遵守此處指出的規(guī)則。如果一個方法定義在多個分類中,該語句不會指定使用哪個分類。 第第11章章 分類和協(xié)議分類和協(xié)議合成對象11.3分類11.1協(xié)議11.211.2 協(xié)議 協(xié)議是多個類共享的一個方法列表。協(xié)議中列出的方法沒有相應(yīng)的實(shí)現(xiàn)。協(xié)議提供一種方式來使用指定的名稱定義一組多少有點(diǎn)相關(guān)的方法。這些方法通常有文檔說明,所以你知道它們將如何執(zhí)行,因此,如果需要,可以在自己的類定義中實(shí)現(xiàn)它們。 如果決定實(shí)現(xiàn)特定協(xié)議的所有方法,也就意味著要遵
13、守或者采用這項(xiàng)協(xié)議。 定義一個協(xié)議很簡單:只要使用protocol指令,之后是你給出的協(xié)議的名稱。然后和處理接口部分一樣,聲明一些方法。 下面是在標(biāo)準(zhǔn)的Foundation頭文件中定義NSCopying協(xié)議的方式:protocol NSCopying- (id)copyWithZone: (NSZone *)zone;end11.2 協(xié)議 如果你的類采用NSCopying協(xié)議,則必須實(shí)現(xiàn)名為copyWithZone:的方法。通過在interface行的一對尖括號內(nèi)列出協(xié)議名稱,可以告知編譯器你正在采用一個協(xié)議,這項(xiàng)協(xié)議的名稱放在類名和它的父類名稱之后,如下所示:interface Addres
14、sBook: NSObject 系統(tǒng)已經(jīng)知道以前為這個協(xié)議定義的方法,所以不必在接口部分聲明這些方法,但是,要在實(shí)現(xiàn)部分定義它們。 如果你的類采用多項(xiàng)協(xié)議,只需把它們都列在尖括號中,用逗號分開:interface AddressBook: NSObject 如果定義了自己的協(xié)議,則不必由自己實(shí)現(xiàn)它。但是,這就告訴其他程序員:如果要采用這項(xiàng)協(xié)議,則必須實(shí)現(xiàn)這些方法。這些方法可以從超類繼承。這樣,如果一個類遵守NSCopying協(xié)議,則它的子類也遵守NSCopying協(xié)議。11.2 協(xié)議 如果希望繼承你的類的用戶實(shí)現(xiàn)一些方法,則可以使用協(xié)議定義這些方法??梢詾槟愕腉raphicObject類定義一
15、個Drawing協(xié)議,并且可以在其中定義paint,erase和outline方法,如下:protocol Drawing-(void) paint;-(void) erase;optional-(void) outline;end 作為GraphicObject類的創(chuàng)建者,你不必實(shí)現(xiàn)這些方法,但是需要制定一些方法,要求從GraphicObject創(chuàng)建子類的人實(shí)現(xiàn)這些方法,以便符合它要創(chuàng)建的繪圖對象的標(biāo)準(zhǔn)。11.2 協(xié)議 可以使用conformToProtocol:方法檢測一個對象是否遵循某項(xiàng)協(xié)議。例如,如果有個名為currentObject的對象,并且想要查看它是否遵循Drawing協(xié)議,可
16、以向它發(fā)送繪圖消息,可以如下編寫:id currentObject;.if (currentObject conformsToProtocol: protocol (Drawing) = YES)/ Send currentObject paint, erase and/or outline msgs.這里使用的專用protocol指令用于獲取一個協(xié)議名稱,并產(chǎn)生一個Protocol對象,conformsToProtocol:方法期望這個對象作為它的參數(shù)。11.2 協(xié)議 通過在類型名稱之后的尖括號中添加協(xié)議名稱,可以借助編譯器的幫助來檢查變量的一致性,如下所示:id currentObject
17、;這告知編譯器currentObject將包含遵守Drawing協(xié)議的對象。如果向currentObject指派靜態(tài)類型的對象,這個對象不遵守Drawing協(xié)議,編譯器將發(fā)出一條警告消息,如下所示:warning: class Square does not implement the Drawing protocol 這里存在一項(xiàng)編譯器校驗(yàn),所以向currentObject指派一個id變量不會產(chǎn)生這條信息,因?yàn)榫幾g器無法知道存儲在id變量中的對象是否遵守Drawing協(xié)議。 如果這個變量保存的對象遵守多項(xiàng)協(xié)議,則可以列出多項(xiàng)協(xié)議,如下代碼所示:id myDocument;11.2 協(xié)議 定義
18、一項(xiàng)協(xié)議時(shí),可以擴(kuò)展現(xiàn)有協(xié)議的定義,所以以下協(xié)議定義protocol Drawing3D 說明Drawing3D協(xié)議也采用了Drawing協(xié)議。 最后,分類也可以采用一項(xiàng)協(xié)議,如下所示:interface Fraction (Stuff) 此處,F(xiàn)raction擁有一個分類Stuff,這個分類采用了NSCopying和NScoding協(xié)議。 和類名一樣,協(xié)議名必須是唯一的。11.2 協(xié)議非正式協(xié)議 非正式協(xié)議實(shí)際上是一個分類,列出了一組方法但并沒有實(shí)現(xiàn)他們。每個人都繼承相同的根對象,因此非正式分類通常是為根類定義的。有時(shí),非正式協(xié)議也稱作抽象協(xié)議。 如果查看頭文件,可能會發(fā)現(xiàn)如下所示的一些方法
19、聲明:interface NSObject (NSComparisonMethods)- (BOOL)isEqualTo:(id)object;- (BOOL)isLessThanOrEqualTo:(id)object;- (BOOL)isLessThan:(id)object;- (BOOL)isGreaterThanOrEqualTo:(id)object;- (BOOL)isGreaterThan:(id)object;- (BOOL)isNotEqualTo:(id)object;- (BOOL)doesContain:(id)object;- (BOOL)isLike:(NSStr
20、ing *)object;- (BOOL)isCaseInsensitiveLike:(NSString *)object;end11.2 協(xié)議 這些代碼為NSObject類定義了一個名為NSComparisonMethods的分類。這項(xiàng)非正式協(xié)議列出了一組方法,可以將它們實(shí)現(xiàn)為協(xié)議的一部分。非正式協(xié)議實(shí)際上僅僅是一個名稱下的一組方法。這在文檔說明和模塊化方法時(shí),可能有所幫助。 聲明非正式協(xié)議的類自己并不實(shí)現(xiàn)這些方法,并且選擇實(shí)現(xiàn)這些方法的子類需要在它的接口部分重新聲明這些方法,同時(shí)還要實(shí)現(xiàn)這些方法中的一個或多個。和正式協(xié)議不同,編譯器不提供有關(guān)非正式協(xié)議的幫助; 如果一個對象采用正式協(xié)議,則
21、它必須遵守協(xié)議中的所有信息。這可以在運(yùn)行時(shí)以及編譯時(shí)強(qiáng)制執(zhí)行。如果一個對象采用非正式協(xié)議,則它可能不需要采用此協(xié)議的所有方法,具體取決于這項(xiàng)協(xié)議??梢栽谶\(yùn)行時(shí)強(qiáng)制要求遵守一項(xiàng)非正式協(xié)議,但是在編譯時(shí)不可以。第第11章章 分類和協(xié)議分類和協(xié)議協(xié)議11.2分類11.1合成對象11.311.3 合成對象合成對象 你已經(jīng)學(xué)習(xí)了通過派生子類和分類等技術(shù)擴(kuò)展類定義的幾種方式。有另一項(xiàng)設(shè)計(jì)定義一個包含其他類的一個或多個對象的技術(shù)。這個新類的對象就是所謂的合成(composite)對象,因?yàn)樗怯善渌麑ο蠼M成的。 比如,考慮第8章中定義的Square類。將這個類定義為Rectangle的子類,因?yàn)槟阒勒叫尉褪堑冗叺木匦?。定義子類時(shí),它繼承了父類的所有實(shí)例變量和方法。在一些情況下,這種做法不合適。例如,在父類中定義的一些方法可能不適合子類使用。Square類繼承了Rectangle的setWidth:andHeig
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 美術(shù)比賽組織與評審標(biāo)準(zhǔn)計(jì)劃
- 如何提高團(tuán)隊(duì)建設(shè)的成效計(jì)劃
- 酒店業(yè)酒店服務(wù)標(biāo)準(zhǔn)化的提升策略
- 超聲科常見疾病診斷與治療策略
- 有效時(shí)間管理策略制定計(jì)劃
- 浙江國企招聘2024金華市羅洋港務(wù)有限公司招聘2人筆試參考題庫附帶答案詳解
- 食品飲料行業(yè)營銷活動創(chuàng)新案例
- 浙江2025年01月浙江省平陽縣企事業(yè)單位2025年面向全球引進(jìn)10名博士筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 河南2025年01月2025年河南平頂山市市直機(jī)關(guān)遴選公務(wù)員報(bào)考指南國家公務(wù)員考試消息筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 跨學(xué)科視角下的臨床前藥效研究進(jìn)展及展望
- 經(jīng)濟(jì)學(xué)彈性理論課件
- 公司員工獎懲制度流程
- 星巴克案例分析-星巴克成功之道
- 把未來點(diǎn)亮歌詞打印版
- 危險(xiǎn)化學(xué)品建設(shè)項(xiàng)目竣工驗(yàn)收報(bào)告
- 國家中醫(yī)藥管理局第3批24個專業(yè)104個病種中醫(yī)診療方案
- 婦產(chǎn)科學(xué)(第9版)第三章 女性生殖系統(tǒng)生理
- LY/T 2241-2014森林生態(tài)系統(tǒng)生物多樣性監(jiān)測與評估規(guī)范
- GB/T 9086-2007用于色度和光度測量的標(biāo)準(zhǔn)白板
- 2023年山東力明科技職業(yè)學(xué)院高職單招(數(shù)學(xué))試題庫含答案解析
- GB/T 24338.4-2018軌道交通電磁兼容第3-2部分:機(jī)車車輛設(shè)備
評論
0/150
提交評論