Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / 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];