动态调度和绑定

时间:2009-02-10 17:27:59

标签: c# java oop

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

由于

马切伊

2 个答案:

答案 0 :(得分:16)

没有。

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

这是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的要求添加了更多示例

答案 1 :(得分:3)

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

根据{{​​3}},动态绑定是OO语言中的一种动态分派形式,其中要调用的实际方法基于操作的名称和运行时的实际接收器。

Wikipedia引入了静态类型的动态绑定(由静态类型系统辅助的动态绑定)和在运行时完全执行的动态绑定。它也将重载视为动态绑定的一种形式。

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