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

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

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

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

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

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

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

有观点认为委托优于继承，使程序代码更为可多、可理解。 Trygve Reenskaug, Dept. of Informatics, University of Oslo, "The Case for Readable Code" (2007)有观点认为委托和继承是等价的，但也有认为一个是另一个特例。

语言支持 
使用类似于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 Citeseer )

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

 Kasper Bilsted Graversen: The nature of roles---A taxonomic analysis of roles as a language construct. Ph.D. Thesis 2006, (Online at IT University of Copenhagen)

外部链接
 A new way to implement Delegate in C++
 Fast delegates in C++
 PerfectJPattern Open Source Project , Provides a reusable implementation of Delegates in Java


Category:面向对象的程序设计
Category:基于原型编程