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.pswp.cn/news/247419.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247419.shtml
英文地址,請注明出處:http://en.pswp.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…