C 中級教學 委託

2021-10-11 07:24:15 字數 2151 閱讀 3451

定義

委託,就是將方法當做引數,傳遞給另外乙個方法處理。

你可以把委託當做一種資料型別,而這種資料型別定義的是方法。

詳解委託,在現實中。就是,當你需要完成一件事情,但是你又不知道具體是如何完成的,所以委託給專業的人去辦理,在此過程中,你只需要約定乙份委託然後交由專業人士即可,你並不知道或者不了解中間的處理流程,而你需要的只是委託。

程式中也是一樣,將本類無法完成的事情,交由第三方去解決。與現實不同的是,沒有中間商賺差價!

舉例我們用傳送訊息來舉例子。首先定義乙個委託

public delegate void sendmessage(string msg);
這裡使用了關鍵字delegate來定義了乙個無返回值(void)的方法sendmessage(訊息傳送),引數包含乙個string型別的msg

委託的定義和介面中定義方法很像,但是他們的概念不同。介面只是在定義規範,繼承介面的類需要符合他的規範。但是委託的目的則是為了讓符合其委託定義結構的方法做為引數去傳遞。

public delegate void sendmessage(string msg);public static void wxsendmessage(string msg)//簡訊傳送訊息方法public static void notesendmessage(string msg)static void main(string args)
然後再main函式中,例項化了定義的委託sendmessage,同時直接將wxsendmessage(方法名稱)作為引數傳遞給了委託。

注意:委託在使用時,必須例項化,所以需要先new乙個委託。

然後使用委託例項化的物件sm直接括號引數列表,傳入了乙個"hello".最終執行結果:

(1)上述例子還可以這麼呼叫,執行效果是一樣的。

new sendmessage(wxsendmessage)("hello");
這種寫法其實屬於鏈式程式設計,即例項化物件以後會返回這個物件,同時直接呼叫這個物件。

(2)還可以這麼呼叫,因為委託在定義時就是為了傳遞方法,那麼直接將方法賦值給定義的委託,起到的效果是一樣的。

sendmessage sm1 = wxsendmessage;sm1("hellp");
多路廣播

委託有個功能叫做多路廣播,也叫做合併委託。

通過運算子"+"號將兩個相同結構的委託合併起來,通過一次傳遞引數,實現兩次呼叫。如:​​​​​​​

static void main(string args)
分別例項化了sm和sm1,乙個是wxsendmessage乙個是notesendmessage。然後通過加號運算子,將其關聯在一起。

最後通過例項物件sm傳遞一次引數。

最終輸出:

與之相反的,同樣也支援"-"號操作

static void main(string args)
上述例子只會輸出wxsendmessage方法對應的語句塊。

因為sm1在廣播佇列中,通過運算子"-"號移除了。

總結本文的例子看起來比較普通,仔細想想,你會感覺這樣東西和直接的方法呼叫有什麼不同?直接定義方法並且呼叫不就好了?為什麼要使用委託來呼叫第三方呢?

首先是因為教學模式,舉例簡單便於你去理解委託是如何玩的。其次,物件導向程式設計語言,其很多特點都是模擬現實圍繞物件模式去展開,所以委託的存在是不可少的。當業務中遇到這種需要交由不同個體去實現乙個結構相同的事務時,最普通的做法就是利用if-else去區分邏輯,但是當這樣的邏輯分支足夠多時,難道還是用多個if-else去拼接嗎?

從前書信很慢,車馬很遠,一生只。。。。。走錯片場了,不好意思!

而委託的廣播功能就更好理解了。

C 中級 事件

定義 從概念上理解,事件就是某乙個物件向另外乙個物件傳送乙個訊息,事件的傳送方負責傳送,接收方負責接收。詳解事件,我硬講,你是肯定不能理解的,因為事件和委託非常相似。事件其實是對委託的封裝 封裝沒忘吧?就是保護 委託,就是發起方明確告訴接收方,我需要什麼。然後接收方就負責去執行。事件,就是我給你傳送...

C 中級 多型

基本概念 include include using namespace std 抽象類,無法例項化物件。class animal class dog public animal class pig public animal 1.在編譯階段,已確定函式位址為animal了。在執行階段,因為有了vi...

C 中級 多型

基本概念 include include using namespace std 抽象類,無法例項化物件。class animal class dog public animal class pig public animal 1.在編譯階段,已確定函式位址為animal了。在執行階段,因為有了vi...