在.NET中有一個非常帶勁的特性,那就是擴充套件方法. 擴充套件方法使你能夠向現有型別“新增”方法(包括你自定義的型別和物件噢),而無需建立新的派生型別、重新編譯或以其他方式修改原始型別。擴充套件方法是一種特殊的靜態方法,但是可以像擴充套件型別上的例項方法一樣進行呼叫。
先看看.NET中擴充套件方法的定義和使用
public static class test { public static bool In(this object o, IEnumerable c) { foreach (object obj in c) if (obj.Equals(o)) return true; return false; } } string[] list = new string[] { "abc" , "123", "C#"}; Console.WriteLine("Object C".In(list));
在.NET中Object 類並沒有In方法的定義,但是的確用"Object C"方法呼叫了In方法。
Object C中的分類(category) 又稱類別在不修改原有的類的基礎上增加新的方法,和.NET一樣不能新增新的例項變數。
新增一個Person的Object C物件,在Person.h檔案中定義相應的書屬性name和age,並且定義一個方法:
-(void) addName:(NSString*) name1 andWithAge:(int) age1;
#import <Foundation/Foundation.h> @interface Person : NSObject{ NSString *name; int age; } @property (retain) NSString *name; @property (nonatomic)int age; -(void) addName:(NSString*) name1 andWithAge:(int) age1; @end
Person 類的詳細描述檔案如下:
#import <Foundation/Foundation.h> @interface Person : NSObject{ NSString *name; int age; } @property (retain) NSString *name; @property (nonatomic)int age; -(void) addName:(NSString*) name1 andWithAge:(int) age1; @end
怎麼呼叫這裡就不說了,如果現在要往類Person中新增一個新的方法
-(void) addCate:(NSString*) cate;
新建一個PersonCategory 類,產生.h,.m兩個檔案。
#import <Foundation/Foundation.h> #import "Person.h" @interface Person(cate) -(void) addCate:(NSString*) cate; @end
在PersonCategory.h檔案中修改為如上程式碼,將PersonCategory改為Person,並且後面括號為(cate) ; () 中的名字可以隨便取
#import "PersonCategory.h" @implementation Person(cate) -(void) addCate:(NSString *)cate{ NSLog(@"dafdasfdsa=%@",cate); } @end
修改PersonCategory.m檔案中的程式碼如上。通過以上程式碼就可以往Person類中新增新方法 addCate 。
測試呼叫addCate方法如下:
Person *peron=[[Person alloc] init]; [peron addName:@"hechen" andWithAge:23]; [peron addCate:@"safdasfds"];
通過以上程式碼可以看得出 Person 可以呼叫addCate方法了,當然呼叫addCate方法需要引入檔案PersonCategory.h 檔案。