Objective-C 2.0中Category简明教程

Objective-C 2.0Category简明教程是本文要介绍的内容,先来简单认识一下CategoryCategory为我们提供了区别于继承的另外一种方法来对类进行扩展。我们可以向任何已有的类添加成员函数来实现功能上的扩展(注:category只允许添加成员函数,不能添加数据成员),添加的函数可以访问类中所有的数据成员,该类的子类也将继承新添加的成员函数。

假设我们需要扩展前面几节用到的book类,添加一个名为Abstract的成员函数来输出书籍的摘要。使用category的格式为:

在头文件中声明category:

@interface 需要扩展的类(category名称) //需要添加的函数 @end

可以看到,声明category的方法同类的声明非常类似。回到我们的例子,如果我们需要向Book类添加Abstract成员函数,对应的声明文件如下所示

// // Book+Abstract.h     



#import <Cocoa/Cocoa.h>   



#import "Book.h"       


@interface Book(Abstract)   


-(NSString*) Abstract;   


end  

注意推荐的文件命名规则:类名+category名.h

接下来我们需要对添加的abstract函数进行定义,如下所示:

// // Book+Abstract.m     


#import "Book+Abstract.h"       


@implementation Book(Abstract)   


-(NSString*)Abstract{   



   NSString* retstr = [[NSString alloc]initWithString:@"The story is..."];   



   [retstr autorelease]; return retstr; }  


@end  

implementation文件的命名规则与头文件相似:类名+category名.m

作为演示,我们只是在Abstract函数中简单的输出一个NSString。下面我们来看客户端如何调用:

 #import <Foundation/Foundation.h>   


 #import "Book.h"   


 #import "Book+Abstract.h"     


 int main (int argc, const char * argv[]) {   



 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];     




 NSString* name = [[NSString alloc] initWithString:@"Harry Porter"];   




 NSNumber* number = [[NSNumber alloc] initWithInt:100];   




 Book *book = [[Book alloc] initWithTitle:name andNumofpages:number];   



 [number release]; [name release];      


 NSLog(@"Abstract: %@", [book Abstract]);   


 [book release];   [pool drain];   


 return 0;  


}  

相关推荐