【发布时间】:2018-03-23 14:18:58
【问题描述】:
我看到一些资源表明动态调度和后期绑定是相同的。如果是这样,那么binding 应该等于dispatching。在某些地方,他们声明overloading/early binding/ static dispatch 相同,overriding/late binding/ dynamic dispatch 相同。
所以我想出了一个比喻来理解这一点。 下面的比喻正确吗?或者我该如何修改下面的解释。
我们的类结构如下。
class Board {
public void show(){};
}
class Shape{
public void draw(Board board) {};
}
class Square extends Shape {
public void draw(Board board) {
System.out.println("Drawing a Square");
};
}
class Circle extends Shape {
public void draw(Board board) {
System.out.println("Drawing a Circle");
};
}
我们有:
Shape shape = createShape(type); // This will return any of Shape, Square, Circle
shape.draw(board);
我们有:
Board myBoard = new Board();
myBoard.show();
我想出了一些解释,
绑定:确定
shape的实际类型(可以是Shape、Square 或Circle)。假设shape的类型仅在运行时已知,则为late binding。可以在编译时确定myBoard的类型。这是early binding调度:决定
draw的实际实现被认为是dispatching。如果draw的实际实现只能在运行时确定,则为dynamic dispatching,否则如果可以在编译时确定,则称为static dispatchingStatic Dispatch :当我在编译时知道调用方法时将执行哪个函数体时发生。所以
myBoard.show(),这里方法show可以静态调度。其中shape.draw(board)我们不能静态调度draw,因为我们不能保证在运行时会执行哪个函数体。单一调度(动态):将仅根据
shape的类型选择draw的实现,而不考虑board的类型或值。多次调度(动态):
shape和board的类型共同决定了将执行哪个draw操作。 (在这种情况下是Double Dispatch)
我使用的资源很少:
- https://lukasatkinson.de/2016/dynamic-vs-static-dispatch/
- https://softwareengineering.stackexchange.com/questions/200115/what-is-early-and-late-binding/200123#200123
- https://en.wikipedia.org/wiki/Late_binding
- https://en.wikipedia.org/wiki/Dynamic_dispatch
- http://net-informations.com/faq/oops/binding.htm
- What is the difference between Binding and Dispatching in Java?
【问题讨论】:
-
"如果是这样,那么
binding应该等于dispatching。" - 我不会这么说。 “绑定”是指将标识符与方法相关联。 “调度”是指进行实际调用。但是,如果您“绑定较晚”,则调度到静态决定的方法是没有意义的。如果你“早绑定”你别无选择,你必须在编译时选择一个方法。 -
那么后期绑定实际上是动态调度吗?对于上述解释,你能说什么,那么解释是否正确?
-
当然,后期绑定可以看作是动态调度的同义词。 (你真的不能没有另一个。)回复。 绑定:不是
shape的实际类型,根据shape的类型,Java 碰巧调用哪个方法。 调度:LGTM。 静态调度:嗯,Board.show可以被覆盖。如果该方法是静态的,或者Board和/或Board.show是最终的,我会同意。 Single Dispatch/Multiple Dispatch:嗯,可以是参数类型,在技术上也可以是其他属性,例如shape的类型 + 月相。 -
所以基本上它是静态调度方法应该是非虚拟的?
-
@aioobe 所以单个和多个解释是正确的,但也可以有其他场景和组合,这就是你的意思我猜。