《objective-c基礎教程》學習筆記(十一)—— 類別

  在編寫面向對象程序的時候,咱們常常想爲現有的類添加一些新的行爲。有些時候,咱們能夠建立這個類的子類。可是,若是咱們用到工具集或者類庫的時候,沒法處理新建的子類。這時,Objective-C就給咱們提供了一個很是方便好用的方式 —— 類別(category)。編程

  那麼,什麼是類別呢?類別是一種爲現有的類添加新方法的方式。你只須要知道這個類的公開接口,不須要知道類的源代碼。並且能夠將類定義模塊化地分佈到多個相關文件中。ide

  類別一樣由聲明部分和實現部分組成,聲明部分語法格式以下:模塊化

1 @interface 已經存在的類名 (類別名)
2     // 方法定義
3     ...
4 @end

  類別實現部分的語法格式以下:函數

1 @implmentation 已經存在的類名 (類別名)
2     // 實現方法代碼
3     ...
4 @end

  類別是Objective-C中一個很是重要的知識,它一般有以下3種用法:工具

1). 利用類別對類進行模塊化設計;
2). 使用類別來調用私有方法;
3). 使用類別來實現非正式協議。 測試

  下面,咱們經過一個例子,給你們展現下如何來使用類別這個方式。就編程習慣而言,通常習慣將類別的接口文件名命名爲「類名+類別名.h」的形式,實現部分文件則命名爲「類名+類別名.m」。spa

  首先,咱們建立一個名爲:NSNumber+Calculate的類文件。建立好類文件,項目中會自動生成兩個文件:設計

  接下來,咱們就分別來寫接口文件和實現文件的代碼。code

 1 //
 2 //  NSNumber+Calculate.h
 3 //
 4 
 5 #import <Foundation/Foundation.h>
 6 
 7 @interface NSNumber(Calculate)
 8     // 在類別中定義了4個方法
 9     -(NSNumber*) add: (double) num2;
10     -(NSNumber*) substract: (double) num2;
11     -(NSNumber*) multiply: (double) num2;
12     -(NSNumber*) divide: (double) num2;
13 @end

  實現部分代碼:對象

 1 //
 2 //  NSNumber+Calculate.m
 3 //
 4 
 5 #import "NSNumber+Calculate.h"
 6 
 7 @implementation NSNumber(Calculate)
 8     // 實現類別的接口部分定義的4個方法
 9     -(NSNumber*) add: (double) num2
10     {
11         return [NSNumber numberWithDouble:([self doubleValue] + num2)];
12     }
13     -(NSNumber*) substract:(double)num2
14     {
15         return [NSNumber numberWithDouble:([self doubleValue] - num2)];
16     }
17     -(NSNumber*) multiply: (double) num2
18     {
19         return [NSNumber numberWithDouble:([self doubleValue] * num2)];
20     }
21     -(NSNumber*) divide: (double) num2
22     {
23         return [NSNumber numberWithDouble:([self doubleValue] / num2)];
24     }
25 @end

  最後,在main主函數中調用定義的方法,來測試下咱們定義的類別方法是否能正常實現。

 1 //
 2 //  main.m
 3 //
 4 
 5 #import <Foundation/Foundation.h>
 6 #import "NSNumber+Calculate.h"
 7 
 8 int main(int argc, const char * argv[])
 9 {
10 
11     @autoreleasepool {
12         NSNumber* myNum = [NSNumber numberWithInt:3];
13         // 測試 add方法
14         NSNumber* add = [myNum add:2.4];
15         NSLog(@"Add: %@", add);
16         // 測試 substract方法
17         NSNumber* substract = [myNum substract:2.4];
18         NSLog(@"Add: %@", substract);
19         // 測試 multiply方法
20         NSNumber* multiply = [myNum multiply:2.4];
21         NSLog(@"Add: %@", multiply);
22         // 測試 divide方法
23         NSNumber* divide = [myNum divide:2.4];
24         NSLog(@"Add: %@", divide);
25     }
26     return 0;
27 }

  正常運行後的結果以下:

  雖然類別能夠重寫原有類中的方法,但一般不推薦這麼作。若是須要重寫原類的方法,更好的建議是經過原有類的派生類,而後再子類中重寫父類的原有方法來實現。

  經過類別爲指定類添加新方法以後,這個新方法不只會影響NSNumber類,還會影響NSNumber類的全部子類,每一個子類都會獲取類別擴展的方法。同時,能夠根據須要,爲一個類定義多個類別,不一樣的類別均可以對原有的類添加方法定義。

  好了,類別的概念和基本的使用方法就介紹這麼多。下一篇博文,咱們將介紹另外幾個在Objective-C中很是重要的:協議和委託。

相關文章
相關標籤/搜索