Java 的双重分发与 Visitor 模式
双重分发(Double Dispatch) 什么是双重分发? 谈起面向对象的程序设计时,常说起的面向对象的「多态」,其中关于多态,经常有一个说法是「父类引用指向子类对象」。 这种父类的引用指向子类对象的写法类似下面这种: 另一种常用的形式是 那上面的keeper调用两次say的时候,会输出什么内容呢?会调用到两个不同的方法吗? 实际上在这两次调用的时候,都会调用到say(Animal a)这个方法。由于这些内容在编译期就能确实下来,这就是 Java 的静态分发。 从上面的图我们看到,对于两次调用生成的字节码,确实都指向了say(Animal a)这个方法,运行时直接执行方法,输出了对应的内容。 那对应的animal.bark()为什么最终会调用到 dog 类的方法?这是在运行时确定具体的方法接收者的类型并执行。这就是所谓的动态分发,在运行时确定具体的方法,实现面向对象的多态。 分发(Dispatch) 分发就是指最终确定一个要执行的方法的过程。 对于 Java 等静态语言来说,都是通过 单一分发(Single Dispatch)来进行的方法执行。 比如这样一行代码 dog.eat...