Double Dispatch讲解与实例-面试题
引言
说实话,我看过GoF《Design Patterns》,也曾深深的被李建忠《设计模式》系列Webcast吸引。但是还没有见过“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的博客,还请大家多多支持!
参考
GoF著作中未提到的设计模式(4):Double Dispatch
关于双分派(Double Dispatch)的一点探讨(案例讲的很透彻,C++的代码)
Acyclic Visitor模式:http://www.objectmentor.com/resources/articles/acv.pdf
Hierachical Visitor Pattern模式:http://en.wikipedia.org/wiki/Hierarchical_visitor_pattern
Double Dispatch讲解与实例-面试题的更多相关文章
- ehcache讲解及实例
ehcache讲解及实例https://www.cnblogs.com/coprince/p/5984816.html 有些情形下注解式缓存是不起作用的:同一个bean内部方法调用,子类调用父类中有缓 ...
- html5的figure/figcaption讲解及实例
html5的figure/figcaption讲解及实例 一.总结 一句话总结: figure元素:用来包着媒体资源,比如图片图表:是一个[媒体组合元素],也就是对其他的媒体元素进行组合,比如:图像. ...
- 注解@PostConstruct与@PreDestroy讲解及实例
从Java EE 5规范开始,Servlet中增加了两个影响Servlet生命周期的注解(Annotion):@PostConstruct和@PreDestroy.这两个注解被用来修饰一个非静态的vo ...
- @PostConstruct与@PreDestroy讲解及实例
关于在spring 容器初始化 bean 和销毁前所做的操作定义方式有三种: 第一种:通过@PostConstruct 和 @PreDestroy 方法 实现初始化后和销毁bean之前进行的操作 第 ...
- java中反射讲解及实例
Java反射机制详解 java 反射 定义 功能 示例 概要: Java反射机制详解 | |目录 1反射机制是什么 2反射机制能做什么 3反射机制的相关API ·通过一个对象获得完整的包名和类名 ·实 ...
- CSS中属性position位置详解功能讲解与实例分析
position有五个值:static.relative.absolute.fixed.inherit. static 是默认值.就是按正常的布局流从上到下从左到右布局,平常我们做网页制作时,没有指定 ...
- 【转】Android的Merge讲解与实例
原文:http://blog.sina.com.cn/s/blog_62f987620100sf13.html 单独将<merge />标签做个介绍,是因为它在优化UI结构时起到很重要的作 ...
- python 堡垒机讲解及实例
paramiko模块,该模块基于SSH用于连接远程服务器并执行相关操作. SSHClient:用于连接远程服务器并执行基本命令 #coding:utf-8 import paramiko ssh=pa ...
- 多测师讲解接口测试 _面试题003_高级讲师肖sir
接口测试 一.你对HTTP有没有了解过?具体讲一下对http的了解.(答题思路: 定义.常见请求类型.状态码.请求头请求体.响应头和响应体.三次握手和四次挥手.)答:了解,我们做接口的时候基本上都是基 ...
随机推荐
- 2.Kali安装VMware tools(详细+异常处理)
dnt@MT:~$ cd /media/cdrom0 进入光驱内 dnt@MT:/media/cdrom0$ ls 查看当前目录下有哪些内容manifest.txt run_upgrader.sh V ...
- Hadoop Shell命令大全
hadoop支持命令行操作HDFS文件系统,并且支持shell-like命令与HDFS文件系统交互,对于大多数程序猿/媛来说,shell-like命令行操作都是比较熟悉的,其实这也是Hadoop的极大 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(2)-easyui构建前端页面框架[附源码]
系列目录 前言 为了符合后面更新后的重构系统,本文于2016-10-31日修正一些截图,文字 我们有了一系列的解决方案,我们将动手搭建新系统吧. 后台系统没有多大的UI视觉,这次我们采用的是标准的左右 ...
- 谁是2016年的.NET开发者?
Nora Georgieva (http://www.telerik.com/blogs/infographic-the-dotnet-developer-of-2016) Whether you h ...
- jQuery:实现两个<select>控件的互移操作
一.直接上代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> < ...
- [摘录]第三部分 IBM文化(2)
第二十二章 原则性领导 在一个组织程序已经变得不受其来源和内容的约束,而且其编纂出来的组织宗旨已经代替了个人责任的组织之中,你所面临的首要任务,就是要全盘抹掉这个程序本身,以便让整个封闭的系统呼吸新鲜 ...
- 匹夫细说C#:庖丁解牛聊委托,那些编译器藏的和U3D给的
0x00 前言 由于工作繁忙所以距离上一篇博客已经过去一个多月的时间了,因此决心这个周末无论如何也得写点东西出来,既是总结也是分享.那么本文主要的内容集中在了委托的使用以及内部结构(当然还有事件了,但 ...
- SignalR系列续集[系列6:使用自己的连接ID]
目录 SignalR系列目录 前言 老规矩,前言~,在此先道个歉,之前的1-5对很多细节问题都讲的不是很详细,也有很多人在QQ或者博客问我一些问题 所以,特开了这个续集.. - -, 讲一些大家在开发 ...
- ASP.NET Core 中文文档 第四章 MVC(2.2)模型验证
原文:Model Validation 作者:Rachel Appel 翻译:娄宇(Lyrics) 校对:孟帅洋(书缘) 在这篇文章中: 章节: 介绍模型验证 验证 Attribute 模型状态 处理 ...
- iOS 保存、读取与应用状态
固化 对于大多数iOS应用,可以将其功能总结为:提供一套界面,帮助用户管理特定的数据.在这一过程中,不同类型的对象要各司其职:模型对象负责保存数据,视图对象负责显示数据,控制器对象负责在模型对象与视图 ...