標籤:
協議的作用類似地C++中對抽象基類的多重繼承。類似於Java中的介面(interface)的概念。
協議是多個類共用方法的列表,協議中列出的方法在本類中並沒有相應實現,而是別的類來實現這些方法。
如果一個類要遵守一個協議,該類就必須實現特定協議的所有方法(可選方法除外).
定義一個協議需要使用@protocol指令,緊跟著的是協議名稱,然後就可以聲明一些方法,在指令@end之前的所有方法的聲明都是協議的一部分。如下:
[cpp] view plaincopy
- @protocol NSCopying
- -(id) copyWithZone:(NSZone*) zone;
- @end
如果你的類決定遵守NSCopying協議,則必須實現copyWithZone方法。通過在@interface中的一對角括弧內列出協議的名稱,告訴編譯你正在遵守一個協議,比如:
@interface Test:NSObject <NSCopying>
執行個體:
Fly.h
[cpp] view plaincopy
- #import <Foundation/Foundation.h>
- @protocol Fly
- -(void) go;
- -(void) stop;
- @optional
- -(void)sleep;
- @end
FlyTest.h
[cpp] view plaincopy
- #import <Foundation/Foundation.h>
- #import "Fly.h"
- @interface FlyTest:NSObject<Fly> {
- }
- @end
FlyTest.m
[cpp] view plaincopy
- #import "FlyTest.h"
- @implementation FlyTest
- -(void) go {
- NSLog(@"go");
- }
- -(void) stop {
- NSLog(@"stop");
- }
- @end
test.m
[cpp] view plaincopy
- #import <Foundation/Foundation.h>
- #import "FlyTest.h"
- int main( int argc, char* argv[]){
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
- FlyTest *flytest = [[FlyTest alloc]init];
- [flytest go];
- [flytest stop];
- [flytest release];
-
- [pool drain];
- return 0;
- }
程式運行結果如下:
go
stop
@protocol的標準文法是:
@protocol 協議名<其它協議, …>
方法聲明1
@optional
方法聲明2
@required
方法聲明3
…
@end
@optional表明該協議的類並不一定要實現方法。
@required是必須要實現的方法。
Objective-c 協議(protocol)