Objective-C中的分類與協議

                                                                                         分類                                                                                                 less

在談分類以前,咱們能夠先探究下,OC中爲何出現分類這種機制,有什麼好處?

假設你接到一個大項目:計算兩個整數的和,差。接到任務的你立刻動手。編寫代碼以下:

#import <Foundation/Foundation>

@interface Calculate :NSObject

@property  int number1,number2;

- (int) sumNumber1:(int)num1 andNumber2: (int)num2;//加法

- (int) subNumber1:(int)num1 andNumber2: (int)num2; //減法

- (void)print;

@end

好了,完成工做。

幾天後,客戶需求發生變化,不只須要加法,減法功能,還要能作到乘除。咱們的作法通常是直接在Calculate類中添加乘,除的方法。固然在這裏是沒有任何問題的。可是在現實的項目中,代碼量十分巨大,以及業務邏輯至關複雜的狀況下,直接修改以前源代碼是冒有很大的風險的!

如今咱們有了另外一種作法那就是——分類。

#import <Foundation/Foundation>

#import」Calculate」//既然是對原有類的接口的擴展,因此必須包括原始接口

@interface Calculate(MulAndDiv)//告訴編譯器這是爲Calculate定義的分類名爲MulAndDiv

- (int) MulNumber1:(int)num1 andNumber2: (int)num2;//乘法

- (int) DivNumber1:(int)num1 andNumber2: (int)num2; //除法

@end

這樣咱們就作到了在不修改原先代碼的狀況下,完成了功能的擴展!

可是使用分類要注意如下事項:

1. 分類能夠訪問原類中的成員變量,可是在分類不能添加任何變量。若須要添加變量能夠考慮建立子類

2. 分類中的方法名能夠與原類的某個方法名相同(即重載),可是原類的同名方法將失效,不能訪問。

3. 能夠建立不少的分類

4. 沒必要實現分類的全部方法。能夠在分類中聲明全部的方法,但不實現,在須要的時候再去實現。

5. 經過分類添加的方法是能夠被子類繼承的。

                                                                                             協議                                                                                             ui

初次接觸協議的人,可能很難理解。協議也能夠理解爲規則或約定。這就像咱們都必須遵照的法律,法律中有憲法,刑法,民法。。。。包含不少的方方面面,告訴了咱們在不一樣狀況下,應該怎麼作。法律是有使用範圍的,中國的法律,只要是中國公民就必須遵照,可是美國人就能夠不遵照。一樣中國人也能夠不遵照美國的法律!

OC中的協議即至關與生活中的法律,它定義了不少的方法,可是並無實現!這須要遵照此協議的類去實現這些方法。這就像你遵照法律去納稅,但法律自己並不納稅。

協議沒有父類,而且不能定義成員變量(這裏有句臺詞:還有王法嗎?王法?我就是王法!顯然法律也不能成爲某一我的的,同時法律沒有身體,不會吃飯)

協議是多個類共享的一個方法列表,協議中列出方法沒有相應的實現,若是一個類採用名爲MyProtocol的協議,就必須實現MyProtocol協議內的@required(必須的)標識的方法。協議用@optional標識的方法可選實現!

協議的使用方法:

@interface Person :NSObject  <chinaProtocol>

這條語句告訴編譯器,Person遵照chinaProtocol協議

若是採用多項協議,只須要他們都列在尖括號中,用逗號分開:

@interface Person :NSObject  <chinaProtocol  , englishProtocol>

有關協議的總結:

1. 若是一個類遵照某項協議,那麼它的子類也遵照該協議

2. 協議是無類的(classless),任何類均可以遵照某項協議

3. 能夠在類型名稱後添加 <協議名> ,可讓編譯器幫助檢查變量的一致性

4. 若是變量保存的對象遵照多項協議,能夠列出多項協議

5. 定義一項協議時,能夠擴展示有協議,即新的協議也遵照舊的協議

@proticol Drawing3D  <Drawing>

Drawing3D協議也採用了Drawing協議,所以採用Drawing3D協議的類必須實現Drawing3D列出的方法以及Drawing列出的方法

6. 分類也能夠採用一項協議

@interface Person(chinaPerson) <NSCopying,NSCoding>

說明Person類擁有一個分類chinaPerson,這個分類遵照NSCopying 和NSCoding協議

 

以上純屬本人理解,有不正確之處,歡迎指正!spa

相關文章
相關標籤/搜索