Multiple Dispatch

今天在看文章的时候遇到了multiple dispatch这个术语。看看了wiki,写得云里雾里。最后搜了搜资料,基本上搞清楚了。

multiple dispatch的混淆之处在于其和object system结合在一起。当然wiki上写得很清楚:“a function or method can be dynamically dispatched based on the run time (dynamic) type of more than one of its arguments.”。这摆明了就是和object system紧耦合在了一起。更准确地来讲multiple dispath其实就是专门针对OO中的消息通信的一个概念。与之相关的概念还有single dispatch和dynamic dispatch。

如 果不考虑object system,我觉得function overloading也可以算是一种multiple dispatch。function overloading需要根据参数的类型以及个数来决议调用函数,过程上来讲和multiple dispatch的定义很像,都是通过参数类型来决定调用函数。但是有一个很重要的不同点:multiple dispatch是runtime行为,而function overloading是编译器在compile-time时就决议好了。

要彻底理解multiple dispatch还要从OO的定义说起:OO其实就是对象以及对象间的通信。C++对于对象间的通信采用了函数调用的方式,这与objective-c有点区别。C++的通信方式可以简单地以object.method()的方式呈现。method其实就是信息,object.method()的意思就是method这个信息被派发给了object。这就是所谓有single dispatch,因为信息只能被派发给一个对象。

先举一个简单的例子。有一个状态机S会接受N种不同的trigger,每个trigger要触发当前状态下的一个动作。

class AbstractTrigger;
class AbstractState
{
public:virtual void AcceptTrigger( AbstractTrigger* _trigger ) = 0;
};class AbstractTrigger
{/*....*/
};
class State1 : public AbstractState
{
public:
  void AcceptTrigger( AbstractTrigger* _trigger )
  {
    /*....*/
  }
};
class Trigger1 : public AbstractTrigger 
{
  
/*....*/
};

目前的难点在于如何根据trigger的类型来选择合适的动作。一种可行的方法是在State1::AcceptTrigger中判断_trigger的实际类型,然后再根据类型去执行相应的动作。这种作法属于过街老鼠式的做法,code review八成是过不去的。另外一种做法是采用visitor pattern的做法,代码如下:

class AbstractTrigger;
class Trigger1;
class AbstractState
{
public:virtual void AcceptTrigger( AbstractTrigger* _trigger ) = 0;virtual void Action1( void ) = 0;
};class AbstractTrigger
{
public:virtual void Action( AbstractState* _state ) = 0;
};class State1 : public AbstractState
{void AcceptTrigger( AbstractTrigger* _trigger ){_trigger->Action }void Action1( void ){/*....*/}
};class Trigger1 : public AbstractTrigger
{
public:void Action( AbstractState* _state ){_state->Action1();}
};

我们在AbstractState中声明了纯虚函数Action1,子类实现它以完成Trigger1时的动作。当然也可以加入Action2, Action3 ... ActionN,分别对应Trigger2, Trigger3 ... TriggerN。在State1::AcceptTrigger中将_trigger派发给了Trigger1,再由Trigger1去调用State1::Action1。之所以整个调用过程做得如此复杂,原因在于State1知道怎么做,但是不知道做哪些;而Trigger1知道做哪些,却不知道怎么做。简言之,在运行时要做哪个动作是由State1和Trigger1两个对象同时决定的,缺一不可。而在C++中一个消息只能同时发给一个对象,在程序需要发消息给多个对象的时候,只能一个一个地去遍历。Lisp有可以把一个消息同时发给多个对象的能力,这种能力就叫做multiple dispatch。

上面的示例代码也可以叫做double dispatch,在wiki上有详细的解释。

参考资料:

  • Multiple Dispatch
  • Multiple Dispatch Wiki

转载于:https://www.cnblogs.com/hughlo/archive/2013/05/28/3100830.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/247419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何让Element UI的Message消息提示每次只弹出一个

Element UI的Message消息提示是点击一次触发一次的。在开发的时候经常会作为一些校验提示,但是公司的测试人员在进行测试时会一直点,然后就会出现如下图的情况。虽然客户使用的时候一般来说不会出现这种情况(毕竟客户不会闲着没事一直点点点&…

jsp头文件的内容/response.setHeader

转载的&#xff01;&#xff01;&#xff01;做一个记录!!!! response.setHeader 是用来设置返回页面的头 meta 信息, 使用时 response.setHeader( name, contect ); meta是用来在HTML文档中模拟HTTP协议的响应头报文。meta 标签用于网页的<head>与</head>中 1、&l…

css3实现科技感的呼吸灯效果

呼吸灯效果是一种常见的灯光效果&#xff0c;比如网页的按钮&#xff0c;现实生活中比如电脑的开机按钮。 使用CSS3的animation方法可以实现很多迷人的网页动画特效。 使用CSS3 配合box-shadow即可实现类似的效果 样式代码如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18…

WIX(20121031) 应用设置默认变量

花了了好长时间找到的 这样可以将变量信息定义到wxs中&#xff0c;方便应用 <?xml version"1.0" encoding"UTF-8"?> <?define ProductName"Wix CY"?> <Wix xmlns"http://schemas.microsoft.com/wix/2006/wi">&l…

百度Echarts折线图tooltip里数据添加单位

option {title: {text: 折线图堆叠},tooltip: {trigger: axis,//在这里设置formatter: {a0}:{c0}万},legend: {data:[邮件营销,联盟广告,视频广告,直接访问,搜索引擎]},grid: {left: 3%,right: 4%,bottom: 3%,containLabel: true},toolbox: {feature: {saveAsImage: {}}},xAxi…

VUE组件 之 Drawer 抽屉

一、源码地址 https://github.com/imxiaoer/DrawerForVue 二、效果图 三、具体代码 drawer.vue <template><div class"drawer"><div :class"maskClass" click"closeByMask"></div><div :class"mainClass"…

什么是基金净值、单位净值、累计净值

基金知识-单位净值和累计净值 一投资者问&#xff1a;单位净值和累计净值分别指什么&#xff1f;如何通过这两个值来评定一个基金&#xff1f; 景顺长城基金管理有限公司答&#xff1a;基金资产净值是在某一时点上&#xff0c;基金资产的总市值扣除负债后的余额&#xff0c;代表…

Java生鲜电商平台-用户管理的架构与实战

Java生鲜电商平台-用户管理的架构与实战 在电商后台中&#xff0c;用户管理是运营人员管理用户的模块。这里的用户区别于运营人员&#xff0c;会在权限的角色管理中分别阐述。这里的用户包含平台的一般用户&#xff0c;会员用户等。本文将分享一下用户管理模块的设计心得。在设…

vue+Element-ui实现分页效果

当我们向后台请求大量数据的时候&#xff0c;并要在页面展示出来&#xff0c;请求的数据可能上百条数据或者更多的时候&#xff0c;并不想在一个页面展示&#xff0c;这就需要使用分页功能来去完成了。 1.本次所使用的是vue2.0element-ui实现一个分页功能&#xff0c;element-…

ListViewAutoScrollHelper

ListViewAutoScrollHelper转载于:https://www.cnblogs.com/ZacharyHodgeZou/p/4208350.html

wx.navigateTo跳转首页无效

问题: 首页A—B,B—C,C—A(回首页无效) 先来看首页,首页是由tabBar中三个页面组成 再来看下首页的代码组成 //只保留核心代码 "tabBar": { ... "list": [ { "pagePath": "pages/home/home", "te…

21款网页版html5小游戏源码

html5魅族创意的贪食蛇游戏源码下载 html5网页版打砖块小游戏源码下载 html5 3D立体魔方小游戏源码下载 html5网页版飞机躲避游戏源码下载 html5三国人物连连看游戏源码下载 js html5 2048数字游戏源码_2048网页版源码下载 html5盲打高手打飞字游戏下载_网页版英文打飞字游戏源…

Cookie的使用(js-cookie插件)

一、安装 npm install js-cookie --save二、引用 import Cookies from js-cookie三、一般使用 存到Cookie去 // Create a cookie, valid across the entire site: Cookies.set(name, value);// Create a cookie that expires 7 days from now, valid across the entire site…

js的array.some()方法

定义和用法 some() 方法用于检测数组中的元素是否满足指定条件&#xff08;函数提供&#xff09;。 some() 方法会依次执行数组的每个元素&#xff1a; 如果有一个元素满足条件&#xff0c;则表达式返回true , 剩余的元素不会再执行检测。如果没有满足条件的元素&#xff0c…

AOP集成防止连续多次点击问题

AOP即Aspect Oriented Programming的缩写,习惯称为切面编程;与OOP(面向对象编程)万物模块化的思想不同,AOP则是将涉及到众多模块的某一类问题进行统一管理,AOP的优点是将业务逻辑与系统化功能高度解耦,让我们在开发过程中可以只专注于业务逻辑,其他一些系统化功能(如路由、日志…

应用内安装部分手机出现解析错误

在做应用内升级安装apk 的时候 出现了 程序包解析出错&#xff0c;这就很难受了 明明程序包有问题&#xff0c;而且还并不是必发&#xff0c;查了下资料发现是7.0版本的问题 有好几种说法会引起这个问题 1 使用了V2包 我们在打包的时候最好不要用V2签名 2 加入临时授权 intent.…

自定义input[type=file]的兼容样式

input[type"file"]的样式在各个浏览器中的表现不尽相同&#xff1a; 1. chrome: 2. firefox: 3. opera: 4. ie: 5. edge: 另外&#xff0c;当我们规定 input[type"file"] 的高度&#xff0c;并把它的行高设置成与其高度相等后&#xff0c;chrome中难看的样…

Excel催化剂开源第37波-音视频文件元数据提取(分辨率,时长,采样率等)

上一篇提到图片元信息Exif的提取&#xff0c;当然还有一类音视频文件&#xff0c;也同样存储着许多宝贵的元数据&#xff0c;那就开源到底呗&#xff0c;虽然自己找寻过程也是蛮艰辛坎坷的&#xff0c;大家看后有收获&#xff0c;只求多多传播下&#xff0c;让前人的工作可以更…

ECharts 雷达图在类目值下面显示数值

需要实现的效果&#xff1a; 官网里面的demo显示数值&#xff0c;都是在拐点处&#xff1a; 【解决】 1、只显示类目 <div id"mychart" style"width:300px;height:300px;margin:0 auto;"></div><script>var arr1 [60,73,85,40,60];var…