什么是方法调度?

问题描述 投票:0回答:2

什么是方法调度?我可以找到几个具体的例子,但我无法找到方法分派的抽象定义。有人愿意冒险吗?

oop programming-languages terminology
2个回答
42
投票

首先我们来说一下什么是消息和方法:

  • A message 是可以从一个对象发送到另一个对象的名称,可能带有其他对象作为参数。例如在

    account withdraw: 100
    

    消息是

    withdraw:
    (Smalltalk 语法。)(其他语言可能会写
    account.withdraw(100)
    。)接收消息的对象(在本例中为
    account
    )称为 接收者

  • 方法是一种可以调用以响应消息的实现。

这些想法在多种面向对象语言中共享,有时以不同的名称命名。例如,C++ 将消息称为“虚拟成员函数”。

现在:

  • 方法调度是用于决定应调用哪个方法来响应消息的算法。不同语言的算法差异很大:

    • 像 Smalltalk 这样的语言,具有类和单一继承,会查阅接收者的类。如果在该类上定义了该方法,则调用该方法。否则,算法将检查唯一的超类,依此类推。

    • 在C++中,方法仍然由接收者的类决定,但由于一个类可以有多个超类,因此决定调用哪个方法的问题更加复杂。

    • 在像 Self 这样的语言中,有方法但没有类,该方法要么在接收器本身的命名

      slot中找到,要么可能在克隆对象的原型中找到。

    • 在更高级的面向对象语言中,方法分派算法不仅检查接收者,还检查随消息传递的“参数”。这个想法有时被称为“多方法”。 (在某种程度上,这种技术可以使用 Smalltalk 所谓的“双重调度”来模拟,但是存在编程成本和性能成本。)我相信 Cecil、Diesel 和 Dylan 语言都使用某种形式的多方法调度,但我我在我的专业知识的边缘摇摇欲坠。

    没有上下文很难说,但我将其描述为在源代码中进行方法调用、决定需要执行哪个方法并执行它、执行任何参数转换、默认等语言要求的过程。
方法分派的决策部分可能纯粹在执行时(例如在动态语言中)、纯粹在编译时(例如在 C#/Java 中调用静态方法)或两者兼而有之(在 C#/Java 中调用虚拟方法)。

15
投票
不同的语言可以有明显不同的方法分派方法。

© www.soinside.com 2019 - 2024. All rights reserved.