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的了解.(答题思路: 定义.常见请求类型.状态码.请求头请求体.响应头和响应体.三次握手和四次挥手.)答:了解,我们做接口的时候基本上都是基 ...
随机推荐
- HTML5_05之SVG扩展、地理定位、拖放
1.SVG绘图总结: ①方法一:已有svg文件,<img src="x.svg"> 方法二:<body><svg></svg>&l ...
- C#异常处理经验(原则与方法)
本文是异常处理经验性的文章,其实跟C#关系也不大.比较适合刚刚熟悉异常语法,而缺乏实战的读者.当然,经验老练的读者也可指出不足.给予意见.补充说明,一起完善文章,分享更多知识与经验. 1 ...
- 高性能JavaScript--数据存储(简要学习笔记二)
1.JavaScript中四种基本数据存取位置:字面量,本地变量,数组元素,对象成员. 一般来说:[字面量,局部变量]运行速度>[数组,对象成员] 2.内部属性包含了一个函数被创建的作用域中 ...
- angular2系列教程(五)Structural directives、再谈组件生命周期
今天,我们要讲的是structural directives和组件生命周期这两个知识点.structural directives顾名思义就是改变dom结构的指令.著名的内建结构指令有 ngIf, n ...
- 分享个 之前写好的 android 文件流缓存类,专门处理 ArrayList、bean。
转载麻烦声明出处:http://www.cnblogs.com/linguanh/ 目录: 1,前序 2,作用 3,特点 4,代码 1,前序 在开发过程中,client 和 server 数据交流一 ...
- Oracle 11g RAC 应用补丁简明版
之前总结过<Oracle 11.2.0.4 RAC安装最新PSU补丁>, 这次整理为简明版,忽略一切输出的显示,引入一些官方的说明,增加OJVM PSU的补丁应用. 环境:RHEL6.5 ...
- 读书笔记--SQL必知必会06--用通配符进行过滤
6.1 LIKE操作符 通配符(wildcard),用来匹配某些值的的特殊字符. 在搜索子句中必须通过LIKE操作符使用通配符. 通配符搜索只能用于文本字段(字符串),非文本数据类型字段不能使用通配符 ...
- 你真的会玩SQL吗?EXISTS和IN之间的区别
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- 从游戏脚本语言说起,剖析Mono所搭建的脚本基础
0x00 前言 在日常的工作中,我偶尔能遇到这样的问题:“为何游戏脚本在现在的游戏开发中变得不可或缺?”.那么这周我就写篇文章从游戏脚本聊起,分析一下游戏脚本因何出现,而mono又能提供怎样的脚本基础 ...
- 跨域之Ajax
提到Ajax,一般都会想到XMLHttpRequest对象,通过这个对象向服务器发送请求,可以实现页面无刷新而更新数据. 由于同源策略的限制,一般情况下,只能通过XMLHttpRequest对象向同源 ...