Objective-C的Categories和protocols

2014-11-24 09:45:14 · 作者: · 浏览: 0

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


-(void) draw{}


@end



//实现多个protocol


@interface Square :NSObject


….


@end



//用法


id square = [[Square alloc] init];


[square draw];