Categories是在不用類繼承的前提下擴展已有的類,該擴展將會影響所有的子類,分為兩種情況,帶名字的和匿名的。
帶名字的Category只能用來擴展其方法,不能定義實例變量和屬性,如下代碼:
//假設Number為已有的類,現對其進行運算擴展
//Number+Ops.h
#import “number.h”
@interface Number(MathOps)
-(Number*) add: (Number*)num;
-(Number*) mul:(Number*) num;
-(Number*) div:(Number*) num;
-(Number*) sub:(Number*) num;
@end
//Number+Ops.m
@implementationNumber (MathOps)
//implementation ofcategory methods
……
@end
匿名的Category是比較特殊的,可以擴展類的實例變量和方法,但所擴展的方法、變量和屬性都為private,只能用於類本身,只能擴展存在實現源代碼的類。如下代碼:
//假設Number為已有的類,並存在其實現部分的源代碼,注意文件名稱
//file Number_Ext.h
#import “Number.h”
@interface Number() {
int var1;
}
//此屬性和方法為private
@property intuniqueID;
-(void) add;
@end
//file Number.m
#import “Number_Ext.h”
@implementationNumber
//已存在的方法實現
…….
//擴展
@syntherizeuniqueID;
-(void) add{
var1 = 2;
self.uniqueID = 2;
}
-(NSString*)description{//override description
[self add];
return @””;
}
@end
Protocols是一系列未實現的方法,其實現延遲到需要該protocol的類,相當於Java中的接口概念,C++中函數成員全為純虛函數的抽象類。其標識符有@required和@optional,用來表明實現該protocol的類是否必須實現其中的方法。
//定義protocol
@protocol Drawable
@required
-(void) draw;
@optional
-(void)otherAsYouWant;
@end
//實現protocol
@interface Square :NSObject <Drawable>
-(void) draw{}
@end
//實現多個protocol
@interface Square :NSObject <Drawable,Movable>
….
@end
//用法
id <Drawable,Movable>square = [[Square alloc] init];
[square draw];