2013年8月16日 星期五

Objective-C Protocols

要求類別一定要實現某些方法時,需要用的到 protocol,代理人模式中 (delegate)常常見到,因為類別在成為另一個類別的代理時,必須實作一些方法以達成代理人的角色。而Objective-C中,因為沒有多重繼承,利用 protocol可以使一個類別具有多重型別的方法。

舉個例子,我們可以定義一些 protocols,@protocol 和 @end 之中宣告要實現的方法,方法的預設值都是required,使用關鍵字@optional將它之下的變成不是必須的,如果是使用新增檔案的方式加入protocol,預設這些 protocols也遵守 (<>) NSObject這個 protocol 。

Behavior.h

@protocol <NSObject>
@optional
-(void)fly;
@required
-(void)run;
-(void)sleep;
@end

Think.h

@protocol <NSObject>
-(void)getRabbit;
-(void)escape;
@optional
-(void)calculate;
@end

然後建立一個類別 Dog , conform/adopt  these protocols,有多個 protocols,用逗點隔開

Dog.h

@interface Dog : NSObject <Behavior, Think>

@end

Dog.m

@implemention Dog
-(void)run
{
    ........
}
-(void)sleep
{
    ........
}
-(void)getRabbit
{
    ........
}
-(void)escape
{
    ........
}
@end

想確認某個物件是否confirm protocol,可以這樣作

id someObject;
......
if ([someObject confirmsToProtocol : @protocol(Think) ] == YES){
    // do something
}

用來宣告型別遵守某些 protocol

id <protocol3, protocol2> someObject ;

沒有留言: