什么是方法调度?我可以找到几个具体的例子,但方法调度的抽象定义让我不知所措。有人想冒险他们吗?
答案 0 :(得分:25)
首先让我们说一下消息和方法是什么:
消息是一个可以从一个对象发送到另一个对象的名称,可能还有其他对象作为参数。例如在
中account withdraw: 100
消息为withdraw:
(Smalltalk语法。)(其他语言可能会写account.withdraw(100)
。)接收消息的对象(在本例中为account
)称为接收器
方法是可以响应消息而调用的实现。
这些想法在各种面向对象的语言中共享,有时以不同的名称。例如,C ++将消息称为“虚拟成员函数”。
现在:
方法调度是用于决定应该响应消息调用哪个方法的算法。不同语言的算法差别很大:
像Smalltalk这样具有类和单继承的语言会参考接收器的类。如果在该类上定义了该方法,则调用该方法。否则算法会检查唯一的超类,依此类推。
在C ++中,该方法仍然由接收者的类决定,但由于一个类可以有多个超类,因此决定调用哪个方法的问题更复杂。
在Self这样的语言中,有方法但没有类,该方法可以在接收器本身的命名槽中找到,也可以在原型中找到该对象被克隆了。
在更高级的面向对象语言中,方法调度算法不仅检查接收器,还检查与消息一起传递的参数。这种想法有时被称为“多方法”。 (在某种程度上,这种技术可以使用Smalltalk调用 double dispatch 来模拟,但是编程成本和性能成本。)我相信Cecil,Diesel和Dylan都使用某种形式的多方法调度,但我在我的专业知识的边缘摇摇欲坠。
答案 1 :(得分:12)
没有上下文很难说,但是我将其描述为在源代码中进行方法调用的过程,决定哪个方法需要执行,执行它,执行任何参数转换,默认等等。语言。
方法调度的决策部分可能纯粹是在执行时(例如在动态语言中),纯粹在编译时(例如在C#/ Java中调用静态方法),或两者兼而有之(在C#/ Java中调用虚方法) )。
不同的语言可能有明显不同的方法调度方法。