@protocol プロトコル名 メソッド宣言1; メソッド宣言2; ・・・ @end
そして、このプロトコルを採用(プロトコルを取り込む事を「採用」と言うようです)するには以下のようにします。
@interface クラス名 : スーパークラス名 <プロトコル名> {
インスタンス変数宣言;
・・・
}
メソッドの宣言;
・・・
@end
スーパクラスに対して、プロトコルを指定する事に対して違和感を覚えますが、Objective-Cは必ずスーパークラスを指定する必要があるので(前記事参照)、あまり深くは考えずにこういうもんだ程度に覚えることにします。
以下にサンプルを載せます。サンプルはPというプロトコルをクラスAが採用しています。
/*************/
/* Protocol */
/*************/
@protocol P
- (void) helloWorld;
@end
/**********
* Class A
**********/
@interface A : NSObject<P> {
}
- (id) init;
@end
@implementation A
- (id) init {
self = [super init];
return self;
}
// プロトコルAの実装
- (void) helloWorld {
printf("Hello World.\n");
}
@end
/**********/
/* main */
/**********/
int main(void) {
//AutoreleasePool
id pool = [[NSAutoreleasePool alloc] init];
//普通のid型変数定義
id classA = [[[A alloc] init] autorelease];
//プロトコルAを採用していることを明示的に
id<P> classA2 = [[[A alloc] init] autorelease];
//これでもOK
A<P> *classA3 = [[[A alloc] init] autorelease];
[classA helloWorld];
[classA2 helloWorld];
[classA3 helloWorld];
//release
[pool release];
return 0;
}
上記サンプルでは、プロトコルを採用したオブジェクトの型宣言として
- id型
- id<プロトコル名> 型
- 具体的なクラス名型
で定義する3パターンでの型定義で実装しています。どちらでも正しく動作します。また当然ですが、メソッドの引数に対してもプロトコルを採用したオブジェクト型を利用することが可能です。
0 件のコメント :
コメントを投稿