委托 (面向对象程序设计)

面向对象程序设计中的委托是指使用另一个对象(发送者)的上下文,对一个对象(接收者)的成员(属性或方法)求值。通过把发送者对象传递给接收者对象,任何面向对象语言都可以做显式的委托。如果语言特性支持成员查询规则,则可以做隐式的委托。隐式委托是基于原型编程中行为重用的基本方法,对应于基于类编程的继承。支持委托的最知名语言是Self和JavaScript。

术语委托在两个对象之间还有别的用法。见委托 (编程)。最容易混淆的是在接收者的上下文中,与发送者成员对应的接收者成员被求值,精确地说这是转发(即包装者对象(wrapper object)并不把自身传递给被包装对象(wrapped object))。简单地使用另一个对象,这是对象聚合 。委托模式是软件设计模式中实现委托的一种套路。

概述
1986年,MIT計算機科學與人工智慧實驗室的首创发表了基于原型编程、利用方法查询规则的面向对象的委托等技术和概念。

委托依赖于动态绑定,因为它需要一个给定的方法可以在不同的运行时上下文中被调用。这可以用于操作系统提供单独一个类管理各个窗口。例如,当用户点击close box, 窗口管理器发送委托:windowShouldClose调用;如果根据窗口的上下文有未保存数据,委托会延迟关闭这个窗口。

不同于转发,委托可以被刻画为自身的迟绑定:

也就是说,接收对象的一个方法定义中的并不是静态绑定到定义时的那个对象,而是在求值时才绑定到“最初”的对象。

有观点认为委托优于继承,使程序代码更为可多、可理解。有观点认为委托和继承是等价的,但也有认为一个是另一个特例。

语言支持
使用类似于C#/Java的伪代码的示例:

class A {
public void foo() {
// "this" also known under the names "current", "me" and "self" in other languages
this.bar();
}

void bar() {
Console.WriteLine("a.bar");
}
};

class B {
private delegate A a; // delegation link

public B(A a) {
this.a = a;
}

public void foo() {
a.foo(); // call foo() on the a-instance
}

public void bar() {
Console.WriteLine("b.bar");
}
};

a = new A();
b = new B(a); // establish delegation between two objects
b.foo();
b.bar();

调用将打印b.bar, 因为在的上下文中引用到最初的接收者对象。的结果的二义性被称作。

把隐式的翻译为显式参数,调用(在中, 是个委托) 翻译为,使用类型做方法的查询解析, 但调用委托的对象作为实参。

使用继承,类似代码为:

class A {
void foo() {
this.bar();
}

void bar() {
print("A.bar");
}
};

class B extends A {
public B() {}

void foo() {
super.foo(); // call foo() of the superclass (A)
}

void bar() {
print("B.bar");
}
};

b = new B();

调用的结果为B.bar. 其中解析为子类的方法.

注释
参考文献
*

  • Lynn Andrea Stein, Henry Liberman, David Ungar: A shared view of sharing: The Treaty of Orlando. In: Won Kim, Frederick H. Lochovsky (Eds.): Object-Oriented Concepts, Databases, and Applications ACM Press, New York 1989, ch. 3, pp. 31–48 (online at [http://citeseer.ist.psu.edu/stein89shared.html Citeseer] )

*

  • Malenfant, J.: On the Semantic Diversity of Delegation-Based Programming Languages, Proceedings of the OOPSLA95, New York: ACM 1995, pp. 215–230.

*

外部链接

评论 (0)

  • 还没有评论,来抢沙发吧。