Object C學習筆記14-分類(category)

賀臣發表於2014-03-17

  在.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.h

  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.m

 

  怎麼呼叫這裡就不說了,如果現在要往類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 檔案。

相關文章