什么是方法调度?我可以找到几个具体的例子,但是方法分派(dispatch)的抽象定义让我难以理解。有人愿意冒险吗?
首先让我们说一下什么是消息和方法:
消息是可以从一个对象发送到另一个对象的名称,可能带有其他对象作为参数。例如在
account withdraw: 100
消息是withdraw:
(Smalltalk 语法。)(其他语言可能写成 account.withdraw(100)
。)接收消息的对象,在本例中为 account
,称为接收者。 方法是可以响应消息而调用的实现。 这些想法在多种面向对象语言中共享,有时使用不同的名称。例如,C++ 将消息称为“虚拟成员函数”。
现在:
方法分派(dispatch)是用于决定应调用哪个方法以响应消息的算法。算法因语言而异:
像 Smalltalk 这样具有类和单继承的语言,会引用接收者的类。如果在该类上定义了该方法,则调用该方法。否则,算法检查唯一的父类(super class),依此类推。 在C++中,方法还是由接收者的类决定的,但是因为一个类可以有多个父类(super class),决定调用哪个方法的问题就比较复杂了。 在像 Self 这样有方法但没有类的语言中,该方法要么在接收器本身的命名槽中找到,要么可能在从中克隆对象的原型(prototype)中找到。 在更高级的面向对象语言中,方法分派(dispatch)算法不仅检查接收者,而且检查与消息一起传递的参数。这个想法有时被称为“多方法”。 (在一定程度上,这种技术可以使用 Smalltalk 所谓的双重调度来模拟,但有编程成本和性能成本。)我相信 Cecil、Diesel 和 Dylan 语言都使用某种形式的多方法调度,但我是在我的专业知识的边缘摇摇欲坠。