歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> 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];

Copyright © Linux教程網 All Rights Reserved