什么是方法调度?

时间:2009-11-26 20:26:29

标签: oop programming-languages

什么是方法调度?我可以找到几个具体的例子,但方法调度的抽象定义让我不知所措。有人想冒险他们吗?

2 个答案:

答案 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中调用虚方法) )。

不同的语言可能有明显不同的方法调度方法。