oop - 什么是方法调度?

标签 oop programming-languages

什么是方法调度?我可以找到几个具体的例子,但是方法分派(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 语言都使用某种形式的多方法调度,但我是在我的专业知识的边缘摇摇欲坠。
  • 关于oop - 什么是方法调度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1805510/

    相关文章:

    programming-languages - 是否有任何编程语言的函数的变量参数不在末尾?

    artificial-intelligence - IDA* 有 15 个拼图,需要帮助

    mysql - 构造多重选择连接 OOP 类

    PHP:从数组中调用一个类?

    php - 仅断言模拟调用的单元测试

    function - 哪些语言是函数抽象而不是原始函数

    c++ - 在 VC++ 中创建程序的有限使用版本

    c - int数组的双指针

    javascript - 在 Node.js 中定义类

    c++ - 如何教授面向对象编程 - 知道从哪里开始吗?