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];