派发机制

分派/派发

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

posted @ 2022-05-05 14:00  天下太平  阅读(154)  评论(0编辑  收藏  举报