Objective-C的Categories和protocols

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

相关推荐