[转]Objective C 2.0 的 Category
转载地址:http://blog.csdn.net/dotphoenix/article/details/4203082
Category为我们提供了区别于继承的另外一种方法来对类进行扩展。我们可以向任何已有的类添加成员函数来实现功能上的扩展(注: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函数进行定义,如下所示:
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;
}
为什么对类进行扩展的feature被称作category?该名称应该反映了某种初衷,那就是当某个类比较复杂庞大时,我们可以对它的功能(也就是成员函数)进行分类,并且把它们放入不同的文件加以实现。