デリゲートって何?

今日は「非形式プロトコル」で出てきた、デリゲートについてです。

「詳解 Objective-C 2.0」の「14-01 デリゲート」を読んでみるとよくわかります。オブジェクト指向プログラミングでいう「委譲」っちゅうやつですね。もしくは、コールバック関数って感じで、デフォルトの実装を提供してもしなくても良いし、それの代わりに処理を行うものが指定されていれば、それを呼び出すという。

その話は良い本を読むなりしましょうというわけで、簡単に例だけ書いてみました。

#import <Foundation/Foundation.h>
 
@interface MyObject1 : NSObject
{
    id delegate;
}
- (void)hello;
- (void)setDelegate:(id)anObject;
@end
 
@implementation MyObject1
- (void)hello {
    if (delegate == nil) {
        NSLog(@"Hello");
    } else if ([delegate respondsToSelector:@selector(hello)]) {
        [delegate hello];
    }
}
 
- (void)setDelegate:(id)anObject {
    delegate = anObject;
}
@end
 
@interface MyObject2 : NSObject
- (void)hello;
@end
 
@implementation MyObject2
- (void)hello {
    NSLog(@"こんにちは");
}
@end
 
int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
 
    MyObject1* myObject1 = [[[MyObject1 alloc] init] autorelease];
    // 以下 2 行を有効にすると、myObject1 は myObject2 に処理を移譲し、"こんにちは" が表示される
    // MyObject2* myObject2 = [[[MyObject2 alloc] init] autorelease];
    // [myObject1 setDelegate:myObject2];
    [myObject1 hello];
 
    [pool drain];
    return 0;
}

デリゲート(myObject2)を指定しなければ myObject1 の hello メソッドが呼び出されて “Hello” と表示されるし、デリゲートを指定すればその hello メソッドが呼び出されて “こんにちは” が表示される、という感じ。

こんなもんスよね。


About this entry