其他平台上所谓的Delegate

在其他平台中,也用到了delegate 这个词,但是意义不太一样。

Design Pattern 中所讲的Delegate

就我的理解,Design Pattern 中所讲的Delegate Pattern,比较像是做一个Wrapper,有一个class 在实现method 时,其实是直接把这个method的实现传递到自己的成员变量实例的实现上。以Objective-C语言实作会像这样:

首先产生一个内部的物件,叫做MyInnerClass

@interface MyInnerClass : NSObject
- (void)doSomething;
@end
@implementation MyInnerClass
- (void)doSomething
{
    NSLog(@"Do something");
}
@end

然后,MyClass会把该做的事情,都交给MyInnerClass

@interface MyClass : NSObject
{
    MyInnerClass *innerObject;
}
- (void)doSomething;
@end
@implementation MyClass
- (void)dealloc
{
    [innerObject release];
    [super dealloc];
}
- (id)init
{
    self = [super init];
    if (self) {
        innerObject = [[MyInnerClass alloc] init];
    }
    return self;
}
- (void)doSomething
{
    [innerObject doSomething];
}
@end

在Cocoa Framework中,会比较像是NSButtonNSButtonCell的关系。你或许会问,为什么Objective-C里头的delegate与Design Pattern里头讲的Delegate Pattern意义不一样?为什么Objective-C不按照这套用法?但其实是, Objective-C使用delegate这个观念,早于Design Pattern成书。

C# 中所谓的Delegate

C# 语言中也有delegate 这个关键字,不过用途却是处理anonymous function,以我们上面的例子,我们打算用C# 增加按钮被点选的event handler,原本是这么写:

private void InitializeComponent()

{

    this.button1 = new System.Windows.Forms.Button();

    this.button1.Click += Button1_Click;

}

private void Button1_Click(object sender, System.EventArgs e)

{

}

在C# 2.0可以写成这样:1

private void InitializeComponent()

{

    this.button1 = new System.Windows.Forms.Button();

    this.button1.Click += delegate(object sender, System.EventArgs e) {

    // Do something here.

    };

}

关于在Objective-C 语言中怎么使用anonymous function,我们会在接下来的章节,讲block 的时候讨论。

1 .参见 http://msdn.microsoft.com/en-us/library/bb882516.aspx

results matching ""

    No results matching ""