Objective-C 2.0中Category簡明教程
Objective-C 2.0中Category簡明教程是本文要介紹的內(nèi)容,先來簡單認(rèn)識(shí)一下Category,Category為我們提供了區(qū)別于繼承的另外一種方法來對類進(jìn)行擴(kuò)展。我們可以向任何已有的類添加成員函數(shù)來實(shí)現(xiàn)功能上的擴(kuò)展(注:category只允許添加成員函數(shù),不能添加數(shù)據(jù)成員),添加的函數(shù)可以訪問類中所有的數(shù)據(jù)成員,該類的子類也將繼承新添加的成員函數(shù)。
假設(shè)我們需要擴(kuò)展前面幾節(jié)用到的book類,添加一個(gè)名為Abstract的成員函數(shù)來輸出書籍的摘要。使用category的格式為:
在頭文件中聲明category:
@interface 需要擴(kuò)展的類(category名稱) //需要添加的函數(shù) @end
可以看到,聲明category的方法同類的聲明非常類似。回到我們的例子,如果我們需要向Book類添加Abstract成員函數(shù),對應(yīng)的聲明文件如下所示
- // // Book+Abstract.h
- #import <Cocoa/Cocoa.h>
- #import "Book.h"
- @interface Book(Abstract)
- -(NSString*) Abstract;
- end
注意推薦的文件命名規(guī)則:類名+category名.h
接下來我們需要對添加的abstract函數(shù)進(jìn)行定義,如下所示:
- // // 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文件的命名規(guī)則與頭文件相似:類名+category名.m
作為演示,我們只是在Abstract函數(shù)中簡單的輸出一個(gè)NSString。下面我們來看客戶端如何調(diào)用:
- #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;
- }
為什么對類進(jìn)行擴(kuò)展的feature被稱作category?該名稱應(yīng)該反映了某種初衷,那就是當(dāng)某個(gè)類比較復(fù)雜龐大時(shí),我們可以對它的功能(也就是成員函數(shù))進(jìn)行分類,并且把它們放入不同的文件加以實(shí)現(xiàn)。
小結(jié):Objective-C 2.0中Category簡明教程的內(nèi)容介紹完了,希望通過本文的學(xué)習(xí)能對你有所幫助!