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


輝輝                                      

(FightingBull Studio)                     


發佈了32 篇原創文章 · 獲贊 8 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章