標籤:
什麼是分類
分類可以使得不修改原來類的代碼的基礎上,對某個類進行方法的擴充。
來看一個簡單的例子:
我們現有一個類Calculator我們為其實現了加法和減法方法:
#import "Foundation/Foundation.h"@interface Calculator : NSObject// Plus-(int) plus: (int)num1 and:(int)num2;// Less-(int) less: (int)num1 and:(int)num2;@end@implementation Calculator-(int) plus:(int)num1 and:(int)num2{ return num1 + num2;}-(int) less:(int)num1 and:(int)num2{ return num1 - num2;}@end
我們將上面Calculator的實現和聲明分別置於Calculator.h和Calculator.m之中,現在的需求是,我們希望對這個計算機類進行擴充,使之能夠進行乘法和除法運算,但因為分工問題,將乘法和除法分別給Tom和Jerry進行開發,但如果Tom和Jerry同時修改Calculator.h和Calculator.m會造成各種各樣的衝突(實際開發中可能會使用SVN或者GIT來自動處理這些問題,但此處假設的需求遠比實際需求簡單得多),因此,我們希望Tom和Jerry各自建立不同的檔案來進行開發,就需要使用到OC的分類。
Tom:
#import <Calculator.h>@interface Calculator(Tom)-(int)multiplied:(int)num1 and:(int)num2;@end@implementation Calculator(Tom)-(int)multiplied:(int)num1 and:(int)num2{ return num1 * num2;}@end
註:為了節省篇幅,將聲明和實現寫在一起,在下文我們仍然認為上面代碼放置於Calculator+Tom.h和Calculator+Tom.m中,下同。
Jerry:
#import <Calculator.h>@interface Calculator(Jerry)-(double)except:(int)num1 and:(int)num2;@end@implementation Calculator(Jerry)-(double)except:(int)num1 and:(int)num2{ return num1 / num2;}@end
當我們需要使用時,分別引入Calculator.h、Calculator+Tom.h、Calculator+Jerry.h:
#import "Calculator.h"#import "Calculator+Tom.h"#import "Calculator+Jerry.h"int main(){ Calculator *calculator = [Calculator new]; [calculator plus:3 and: 4]; // output: 7 [calculator less:3 and: 4]; // output: -1 [calculator multiplied:3 and: 4]; // output: 12 [calculator except:3 and: 4]; // output: 0.75 return 0;}
使用注意:
- 分類只能擴充方法,不能增加成員變數的定義
- 類和分類中的如果有相同名稱的方法,會覆蓋掉原來類的同名方法,導致原類的方法不可用
- 調用的順序是:分類的方法優先順序是最高的,然後才是原來類的方法的優先順序次之
- 如果一個類有多個分類的時候,編譯的時候的順序,就是方法調用的優先順序
[黑馬程式員]Objective-C 物件導向之分類