派发机制
分派/派发
dispatch
变量被声明时的类型叫做变量的静态类型(Static Type)。
变量所引用的对象的真实类型又叫做变量的实际类型(Actual Type)。
根据对象的类型而对方法进行的选择,就是分派(Dispatch)。
分派时期
根据分派生的时期,可以将分派分为两种,静态分派和动态分派。
静态分派
Static Dispatch
静态分派发生在编译时期,分派根据静态类型信息选择合适的方法。称为编译时多态。
可以用来实现类型安全、运行高效的同质对象集合操作。
函数重载、基于模板的实现。
动态分派
Dynamic Dispatch
动态分派发生在运行时期,动态分派动态地置换掉某个方法。
称为运行时多态、动态多态(dynamic polymorphism)。
通过类继承机制和虚函数机制生效于运行期。可以优雅地处理异质对象集合,只要其共同的基类定义了虚函数的接口。也被称为子类型多态(Subtype polymorphism)。
分派类型
选择方法时,需要考虑方法的接收者类型和方法的参数类型
根据分派的类型,可以将分派分为两种,单分派和多分派。
单分派
single dispatch
面对对象语言的分派只基于第一参数,经常有特殊的参数语法,并且有时是暗含而非显式写成一个参数。
通常是调用对象的实际类型。
C++就是通过this指针的实际类型来选择合适的方法。
参考这个进一步理解:https://blog.csdn.net/wx_14678/article/details/106441590
C++实现了基于继承的面向对象,通过让某个method属于一个class来实现多态。
C++关注class之间的行为,即数据传递。
多分派
multiple dispatch、multimethod、MD
使用方法的所有参数,而非只用第一个,来决定调用哪个方法。
Julia自带多重分派机制。多重分派和类型系统是julia的基础核心。
julia是面向方法的。
julia的type
julia中只有type、object,没有class的概念。
object是type的实例。
type除了自己的constructor以外是不允许含有其它方法的。
method是类型(type)和类型之间的相互作用(interaction)。
类型仅仅是用来派发行为的一种标签。
julia关注type之间的行为。
子类型会获得父类型行为,而不会获得父类型的成员。即鸭子类型(Duck Type)。
More
Open Multi-Methods for C++https://www.stroustrup.com/multimethods.pdf
C++单分派和双分派问题https://blog.csdn.net/wx_14678/article/details/106441590
https://www.youtube.com/watch?v=Y95fAipREHQ
https://zhuanlan.zhihu.com/p/105953560
浅谈Julia语言:Julia的编程范式https://zhuanlan.zhihu.com/p/38434080