要求類別一定要實現某些方法時,需要用的到 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 ;
沒有留言:
張貼留言