博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Double Dispatch讲解与实例-面试题
阅读量:5321 次
发布时间:2019-06-14

本文共 1648 字,大约阅读时间需要 5 分钟。

引言

说实话,我看过GoF《》,也曾深深的被李建忠吸引。但是还没有见过“Double Dispatch模式”。的确GoF提及的设计模式只是最初对设计模式的系统介绍,它不可能涵盖所有的模式。另外随着时间的流逝,技术日新月异的变化,技术大牛们又总结出了许多新的模式。

今天所介绍的Double Dispatch模式,从时间上来看,已不是新的设计模式;但对于只看过GoF设计模式的技术同仁来说,也算是一个新的设计模式。

什么是DoubleDispatch?

对,没有“模式”二字。从字面翻译来看,网上好多人翻译为双分发,双分派。Wiki上对Double Dispatch的解释:

 

In software engineering, double dispatch is a special form of multiple dispatch, and a mechanism that dispatches a function call to different concrete functions depending on the runtime types of two objects involved in the call. In most object-oriented systems, the concrete function that is called from a function call in the code depends on the dynamic type of a single object and therefore they are known as single dispatch calls, or simply virtual function calls.

大意:

 

在软件工程中,Double Dispatch是一种特殊形式的Multiple Dispatch,也是根据于两个对象的运行时类型来调用的其相应具体类(不是基类)方法的一种机制。在大多数面向对象的系统中,在代码(程序)中的一个函数调用具体类的方法都取决于单个对象的动态类型(运行时的类型),(它们一般)被称为Single Dispath calls,或只是虚拟函数调用。

 

不难看出一次虚函数的调用叫做Single Dispath ,那么Double Dispatch应该就是两次虚函数的调用啦。

更进一步说就是一次通过动态类型(运行时类型)调用相应子类真实类型的方法函数,就称为一次Dispath。那么以此类推,需要两次通过运行时类型调用相应类型的方法函数,则称为Double Dispatch。

 

举例说明:

Single Dispatch 实例:

DoubDispatch 实例:

为啥要搞Double Dispatch?

 

输出结果

 

怎么没有输出“Dog Type”和“Mammals Type”呢?不对呀!!

怎么解决?

用Dynamic来解决

 

通过查阅关于决议相关的说明我们可以了解到:

重载是在编译时就决定了,所以无法在运行时动态决定。重写才是动态运行时决定的。

输出结果:

这样的解决虽然看起来解决了问题?但我不通过Double Dispatch 来实现的。只是通过了Dynamic。

用Vistor 模式来解决

 

总结

C# 现在引入Dynamic 来支持“Double Dispatch”,但我们应该清楚到底为什么要用这个关键字.

如果没有这个关键字,C#又是如何支持“Dobule Dispatch”的,这就是本篇所讲的目的。

更多关于Vistor内容,大家可自行百度谷歌。

后续我想写一篇关于Vistor的博客,还请大家多多支持!

参考

(案例讲的很透彻,C++的代码)

Acyclic Visitor模式:

Hierachical Visitor Pattern模式:

转载于:https://www.cnblogs.com/HQFZ/p/4942561.html

你可能感兴趣的文章
判断两个时间在15分钟内_DLP打印机可以在15分钟内打印出牙模
查看>>
如何提取明细表头_Excel如何提取客户第一次与最后一次出现的记录?字典1秒搞定...
查看>>
净水器多久_净水器滤芯多久换一次最好?
查看>>
删除一个单词_2021考研英语暑假复习经验分享!单词背会了吗?
查看>>
安卓系统录音怎么设置采样率_安卓手机便签敬业签怎么快速修改设置提醒的时间?...
查看>>
考上985能改变命运吗_有985实力,高考考砸只能去211,我该复读吗?复读一定会考上吗?...
查看>>
搭建kafaka_Kafka集群搭建
查看>>
python svm xml_svm+python实现(更新)
查看>>
九龙擒庄指标源码破译_九龙擒庄指标源码破译
查看>>
ant构建项目迁移到gradle_从 Gradle 使用 Ant
查看>>
mysql存储过程_MySql存储过程与函数详解
查看>>
会声会影2019渲染闪退_使用会声会影的五大理由,赶紧来看!
查看>>
js事件点击第二次才触发是为什么_JS防抖和节流傻傻分不清楚
查看>>
php mysql管理_PHP简单mysql管理工具,支持执行多条mysql语句!
查看>>
mysql客户端反向映射entity_Mysql服务端反向读取客户端的任意文件
查看>>
hbase 如何导入到mysql_hbase 的数据 怎么导出到 一个文件或者mysql里面
查看>>
html存入mysql数据库_html,jquery,ajax,servlet,mysql实现前端数据写入数据库
查看>>
perf mysql_MySQL性能分析工具(perf和Flame Graphs)
查看>>
分布式 mysql amoeba_用Amoeba构架MySQL分布式数据库环境
查看>>
mysql 数据库已运行时长_查看 MySQL 已经运行多长时间的方法
查看>>