Objective-c 協議(protocol)

協議的做用相似地C++中對抽象基類的多重繼承。相似於Java中的接口(interface)的概念。
  協議是多個類共享方法的列表,協議中列出的方法在本類中並無相應實現,而是別的類來實現這些方法。ui

  若是一個類要遵照一個協議,該類就必須實現特定協議的全部方法(可選方法除外).spa

  定義一個協議須要使用@protocol指令,緊跟着的是協議名稱,而後就能夠聲明一些方法,在指令@end以前的全部方法的聲明都是協議的一部分。以下:
.net

  1. @protocol NSCopying  
  2. -(id) copyWithZone:(NSZone*) zone;  
  3. @end  


若是你的類決定遵照NSCopying協議,則必須實現copyWithZone方法。經過在@interface中的一對尖括號內列出協議的名稱,告訴編譯你正在遵照一個協議,好比:
@interface Test:NSObject <NSCopying>
blog

實例:
Fly.h
繼承

  1. #import <Foundation/Foundation.h>  
  2. @protocol Fly  
  3.   -(void) go;  
  4.   -(void) stop;  
  5. @optional  
  6.   -(void)sleep;  
  7. @end  


FlyTest.h
接口

  1. #import <Foundation/Foundation.h>  
  2. #import "Fly.h"  
  3. @interface FlyTest:NSObject<Fly> {  
  4. }  
  5. @end  


FlyTest.m
ip

  1. #import "FlyTest.h"  
  2. @implementation FlyTest  
  3. -(void) go {  
  4.    NSLog(@"go");  
  5. }  
  6. -(void) stop {  
  7.    NSLog(@"stop");  
  8. }  
  9. @end  


test.m
get

  1. #import <Foundation/Foundation.h>  
  2. #import "FlyTest.h"  
  3. int main( int argc, char* argv[]){  
  4.   NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];  
  5.   FlyTest *flytest = [[FlyTest alloc]init];  
  6.   [flytest go];  
  7.   [flytest stop];  
  8.   [flytest release];  
  9.   
  10.   [pool drain];  
  11.   return 0;  
  12. }  


程序運行結果以下:
string

go
stop
it


@protocol的標準語法是:
@protocol 協議名<其它協議, …>
  方法聲明1
@optional
  方法聲明2
@required
  方法聲明3

@end


@optional代表該協議的類並不必定要實現方法。
@required是必需要實現的方法。

相關文章
相關標籤/搜索