其他平台上所谓的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中,会比较像是NSButton
与NSButtonCell
的关系。你或许会问,为什么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 ↩