动态调度和绑定

2022-09-03 13:49:38

动态调度和动态绑定是一回事吗?

谢谢

马切伊


答案 1

不。

动态调度 - 实际的方法组/签名/覆盖链在编译时绑定。调用的方法依赖于对象的实际运行时类型,但不发生实际的解释。它仍将是静态绑定方法的一个版本。

下面是 C# 中的一个示例。

class Foo { 
  public override string ToString() { return "foo's ToString"; }
}

void Example(object p1) { 
  p1.ToString();
}

对 p1 的调用。ToString 是动态调度的一个示例。代码静态绑定到方法 ToString。然而,它是一个虚拟方法,所以实际的.ToString() 调用直到运行时才会被知道,但可以保证调用 .ToString() 方法。它将是 p1 实际类型的 ToString。因此,如果 p1 实际上是 Foo 的一个实例,则将调用 Foo::ToString。

动态绑定 - 实际方法在运行时绑定,并根据语言或反射框架的语义进行解释。这可能由于无法绑定而失败。

例:

void CallBar(object o) {
  var method = o.GetType().GetMethod("Bar");
  method.Invoke(new object[] {o});
}

在本例中,我们尝试在相关对象上调用方法“Bar”。关键字正在尝试。对象上完全可能存在“Bar”不存在。但这是在运行时通过动态绑定到方法“Bar”来确定的。

它们最有共同点的是,这两个操作(可能)都取决于对象的运行时类型。

编辑

应OP的要求增加了一些示例


答案 2

动态调度或动态绑定意味着在调用方法时,选择要执行的实际方法实现是在程序运行时发生的,因为静态上没有足够的可用信息。它将基于方法名称,实际的接收器类型(子类型多态性)和/或实际的参数类型(重载),甚至更花哨的模式匹配。

根据维基百科的说法,动态绑定是OO语言中的一种动态调度形式,其中要调用的实际方法基于操作的名称和运行时的实际接收器。

本文介绍静态类型动态绑定(由静态类型系统辅助的动态绑定)和在运行时完全执行的动态绑定。它还将重载视为动态绑定的一种形式。

我相信你可以找到许多其他关于动态调度或绑定的文章。据我所知,术语不是固定的和“过载的”。最好描述运行时实际发生的情况(如何选择特定方法的确切过程),而不是尝试正确定义这两个术语中的任何一个。