第九章 分類和協(xié)議

第九章 分類和協(xié)議

9.1 分類
通過分類(category)可以以模塊的方式向現(xiàn)有的類添加方法。 它提供了一種簡單的方式, 用它可以將類

的定義模塊化到相關(guān)方法的組或分類中。它還提供了擴(kuò)展現(xiàn)有類定義的簡便方式,并且不必訪問類的源代 碼,也無需創(chuàng)建子類。

對(duì)于 Fraction 類,除了將兩個(gè)分?jǐn)?shù)相加的 add:方法外,還想要擁有將兩個(gè)分?jǐn)?shù)相減、相乘和相除的方 法。

//**********************************************************************************************// // Fraction 類聲明

#import<Foundation/Foundation.h> @interface Fraction : NSObject
{

int numerator;

int denominator; }

@property int numerator, deniminator; -(void) setTo:(int) n over: (int) d; -(Fraction *) add: (Fraction *) f; -(void) print;

// 聲明分?jǐn)?shù)的 加法函數(shù)

@end //*********************************************************************************************//

現(xiàn)在,從接口部分刪除 add:方法,并將其添加到新分類,同時(shí)添加其他三種要實(shí)現(xiàn)的數(shù)學(xué)運(yùn)算??匆?

下新 MathOps 分類的接口部分。 //*********************************************************************************************//

#import<Foundation/Foundation.h>
#import "Fraction.h"
@interface Fraction (MathOps)
-(Fraction *) add: (Fraction *) f; // 加法函數(shù)

-(Fraction *) mul: (Fraction *) f;

-(Fraction *) sub: (Fraction *) f;

-(Fraction *) div: (Fraction *) f;

// 乘法函數(shù) // 減法函數(shù) // 除法函數(shù)

@end //*********************************************************************************************//

// #inport "Fraction.h" 這里既是分類接口部分的定義,也是對(duì)現(xiàn)有接口部分的擴(kuò)展,所以必須包括原始接口部分 // @interface Fraction (MathOps) 告訴編譯器正在為 Fraction 類定義新的分類,名稱為 MathOps。

可以在一個(gè)實(shí)現(xiàn)文件中定義 Fraction.h 接口部分中的所有方法,以及 MathOps 分類中的所有方法。

也可以在單獨(dú)的實(shí)現(xiàn)部分定義分類的方法。在這種情況下,這些方法的實(shí)現(xiàn)部分還必須找出方法所屬 的分類。 與接口部分一樣, 通過將分類名稱括在類名稱之后的圓括號(hào)中來確定方法所屬的分類, 如下示:所

@implementation Fraction (MathOps) // code for category methods

... @end

關(guān)于分類的一些注意事項(xiàng)
A、 盡管分類可以訪問原始類的實(shí)例變量, 但是它不能添加自身的任何變量。 如果需要添加量,變

可以考慮創(chuàng)建子類。
B、 分類可以重載該類中的另一個(gè)方法,但是通常認(rèn)為這種做法不可取。因?yàn)?重載之后,再不

能訪問原來的方法。
C、 可以擁有很多分類。
D、 和一般接口部分不同的是,不必實(shí)現(xiàn)分類中的所有方法。這對(duì)于程序擴(kuò)展很有用,可以在該

分類中聲明所有方法,然后在一段時(shí)間之后才實(shí)現(xiàn)它。
E、 通過使用分類添加新方法來擴(kuò)展類不僅會(huì)影響這個(gè)類,同時(shí)也會(huì)影響它的所有子類。

9.2 協(xié)議 協(xié)議的聲明類似于類接口的聲明,有一點(diǎn)不同的是,協(xié)議沒有父類,并且不能定義成員變量。下面的

例子演示了只有一個(gè)方法的協(xié)議的聲明:

@protocol MyProtocol

- (void)myProtocolMethod; @end

協(xié)議是多個(gè)類共享的一個(gè)方法列表, 協(xié)議中列出的方法沒有相應(yīng)的實(shí)現(xiàn)。 如果一個(gè)類采用MyProtocol 協(xié)議,則必須實(shí)現(xiàn)名為 myProtocolMethod 的方法。

通過在@interface 行的一對(duì)尖括號(hào)<...>內(nèi)列出協(xié)議名稱,可以告知編譯器你正在采用一個(gè)協(xié)議。這項(xiàng) 協(xié)議的名稱放在類名和它的父類名稱之后,如下所示:

@interface AddressBook: NSObject <myProtocol>

這說明, AddressBook 是父類為 AddressBook 的對(duì)象,并且它遵守 myProtocolMethod 協(xié)議。在 AddressBook 的實(shí)現(xiàn)部分,編譯器期望找到定義的myProtocolMethod 方法。

如果采用多項(xiàng)協(xié)議,只需把它們都列在尖括號(hào)中,用逗號(hào)分開:
@interfaceAddressBook: NSObject<myProtocol,yourProtocol>
以上代碼告知編譯器 AddressBook 類采用 myProtocolMethod 和 yourProtocolMethod 協(xié)議。這次,編

譯器將期望在 AddressBook 的實(shí)現(xiàn)部分看到為這些協(xié)議列出的所有方法的實(shí)現(xiàn)。

有關(guān)協(xié)議的注意事項(xiàng):
A、如果一個(gè)類遵守某項(xiàng)協(xié)議,那么它的子類也遵守該協(xié)議。 B、協(xié)議不引用任何類,它是無類的(classless) 。任何類都可以遵守某項(xiàng)協(xié)議。 C、通過在類型名稱之后的尖括號(hào)中添加協(xié)議名稱,可以借助編譯器的幫助來檢查變量的一致性,如

下:

id <Drawing> currentObject;
這告知編譯器 currentObject 將包含遵守 Drawing 協(xié)議的對(duì)象。 如果向currentObject 指派靜態(tài)類型的對(duì)

象,這個(gè)對(duì)象不遵守 Drawing 協(xié)議,編譯器將給出 warning。
再次提到 id 類型,如果向 currentObject 指派一個(gè) id 變量,不會(huì)產(chǎn)生這條消息,因?yàn)榫幾g器不知道存

儲(chǔ)在 id 變量中的對(duì)象是否遵守 Drawing 協(xié)議。 D、如果這個(gè)變量保存的對(duì)象遵守多項(xiàng)協(xié)議,則可以列出多項(xiàng)協(xié)議,如下:

id <Drawing, Drawing 1> currentObject; E、定義一項(xiàng)協(xié)議時(shí),可以擴(kuò)展現(xiàn)有協(xié)議的定義。以下協(xié)議

@protocol Drawing3D <Drawing>
說明 Drawing3D 協(xié)議也采用了 Drawing 協(xié)議。因此采用 Drawing3D 協(xié)議的類都必須實(shí)現(xiàn)此協(xié)議列出

的方法,以及 Drawing 協(xié)議的方法。 F、分類也可以采用一項(xiàng)協(xié)議,如:

@interface Fraction (stuff) <NSCopying, NSCoding>
此處,Fraction 擁有一個(gè)分類 stuff,這個(gè)分類采用了 NSCopying 和 NSCoding 協(xié)議。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容