什么是方法调度?

Pro*_*ofK 31 oop programming-languages

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

Nor*_*sey 28

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

  • 消息是可以从一个对象发送到另一个,可能带有附加对象作为参数的名称.例如在

    account withdraw: 100
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 方法是,可以响应于一个消息被调用的实现.

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

现在:

  • 方法分派是用于决定响应消息应该调用哪个方法的算法.不同语言的算法差别很大:

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

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

    • 在具有方法但没有类的Self这样的语言中,该方法可以在接收器本身的命名槽中找到,也可以在克隆对象的原型中找到.

    • 在更高级的面向对象语言中,方法调度算法不仅检查接收器,还检查与消息一起传递的参数.这种想法有时被称为"多方法".(在一定程度上,这种技术可以用什么Smalltalk的调用模拟双调度,但有一个节目的成本和性能为代价.)我相信语言塞西尔,柴油,和Dylan都使用某种形式的多方法分派的,但我在我的专业知识的边缘摇摇欲坠.

  • 你能引用你的消息来源吗? (3认同)

Jon*_*eet 12

这很难不利用上下文的说法,但我把它描述为这需要一个方法调用的源代码,决定哪些方法需要执行,并执行它的过程中,进行任何参数转换,违约等所要求的语言.

方法调度的决策部分可以纯粹是在执行时(例如,在动态语言中),纯粹在编译时(例如,在C#/ Java中调用静态方法),或两者(在C#/ Java中调用虚方法).

不同的语言可以有明显不同的方法分派方法.

  • @samyismyhero:老实说,这取决于您所说的“前端控制器”是什么意思...... (2认同)