2011年2月13日日曜日

Objective-C(プロトコル)

プロトコルとはJavaでのインタフェースと同様に、オブジェクトの役割や振る舞いを表すメソッドの定義群の事を表します。プロトコルの定義は以下のように行います。

@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 件のコメント :

コメントを投稿