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的了解.(答题思路: 定义.常见请求类型.状态码.请求头请求体.响应头和响应体.三次握手和四次挥手.)答:了解,我们做接口的时候基本上都是基 ...
随机推荐
- 06.GitHub实战系列~6.过滤器过滤掉的文件如何上传
比如我想发布一个软件版本供普通人下载: Git库建立了VS的过滤规则后 dll 和 exe 是自动过滤的,这时候我们得加参数(看图)git add xxx -f
- NLB网路负载均衡管理器详解
序言 在上一篇配置iis负载均衡中我们使用啦微软的ARR,我在那篇文章也中提到了网站的高可用性,但是ARR只能做请求入口的消息分发服务,这样如果我们的消息分发服务器给down掉啦,那么做再多的应用服务 ...
- 编写Windows服务疑问1:操作过程
Windows 服务开发平时不太受人关注,毕竟那是高大上的项目类型,平常需求也用不上,很多老掉牙的家伙也只知有WinForm,仍不知有WPF,更别说Windows 服务了,正如陶渊明所写的,“不知有汉 ...
- nginx+php 在windows下的简单配置安装
开始前的准备 PHP安装包下载:http://windows.php.net/downloads/releases/php-5.5.14-Win32-VC11-x86.zip Nginx 下载地址:h ...
- 重磅来袭,使用CRL实现大数据分库分表方案
关于分库分表方案详细介绍 http://blog.csdn.net/bluishglc/article/details/7696085 这里就不作详细描述了 分库分表方案基本脱离不了这个结构,受制于实 ...
- ASP.NET Core 中文文档 第二章 指南(4.3)添加 View
原文:Adding a view 作者:Rick Anderson 翻译:魏美娟(初见) 校对:赵亮(悲梦).高嵩(Jack).娄宇(Lyrics).许登洋(Seay).姚阿勇(Dr.Yao) 本节将 ...
- 利用Python进行数据分析(12) pandas基础: 数据合并
pandas 提供了三种主要方法可以对数据进行合并: pandas.merge()方法:数据库风格的合并: pandas.concat()方法:轴向连接,即沿着一条轴将多个对象堆叠到一起: 实例方法c ...
- 通过pycharm使用git[图文详解]
前言 使用git+pycharm有一段时间了,算是稍有点心得,这边整理一下,可能有的方法不是最优,欢迎交流,可能还是习惯敲命令去使用git,不过其实pycharm已经帮忙做了很多了,我们可以不用记住那 ...
- 记录软件工程课程项目开发时遇到的各种小问题(django)
1.python manage.py makemigrations 无效/无法检测出model的变化 在修改了models.py之后,我们想要更新数据库的表,使用了python manage.py m ...
- JDBC 详解(转载)
原文链接:http://blog.csdn.net/cai_xingyun/article/details/41482835 什么是JDBC? Java语言访问数据库的一种规范,是一套API JDBC ...