程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#委托和事件詳解(6)

C#委托和事件詳解(6)

編輯:關於C語言

我們運行這段代碼,嗯,沒有任何問題。程序一如預料地那樣輸出了:

Morning, Jimmy Zhang

早上好, 張子陽

現在,假設我們需要使用上一節學到的知識,將多個方法綁定到同一個委托變量,該如何做呢?讓我們再次改寫代碼:

以下是引用片段:

static void Main(string[] args) {
GreetingManager gm = new GreetingManager();
GreetingDelegate delegate1;
delegate1 = EnglishGreeting;
delegate1 += ChineseGreeting;
gm.GreetPeople("Jimmy Zhang", delegate1);
}

輸出:

Morning, Jimmy Zhang

早上好, Jimmy Zhang

到了這裡,我們不禁想到:面向對象設計,講究的是對象的封裝,既然可以聲明委托類型的變量(在上例中是delegate1),我們何不將這個變量封裝到 GreetManager類中?在這個類的客戶端中使用不是更方便麼?於是,我們改寫GreetManager類,像這樣:

以下是引用片段:

public class GreetingManager{
//在GreetingManager類的內部聲明delegate1變量
public GreetingDelegate delegate1;
public void GreetPeople(string name, GreetingDelegate MakeGreeting) {
MakeGreeting(name);
}
}

現在,我們可以這樣使用這個委托變量:

以下是引用片段:

static void Main(string[] args) {
GreetingManager gm = new GreetingManager();
gm.delegate1 = EnglishGreeting;
gm.delegate1 += ChineseGreeting;
gm.GreetPeople("Jimmy Zhang", gm.delegate1);
}

輸出為:

Morning, Jimmy Zhang

早上好, Jimmy Zhang

盡管這樣做沒有任何問題,但我們發現這條語句很奇怪。在調用gm.GreetPeople方法的時候,再次傳遞了gm的delegate1字段:

gm.GreetPeople("Jimmy Zhang", gm.delegate1);

既然如此,我們何不修改 GreetingManager 類成這樣:

public class GreetingManager{
//在GreetingManager類的內部聲明delegate1變量
public GreetingDelegate delegate1;
public void GreetPeople(string name) {
if(delegate1!=null){ //如果有方法注冊委托變量
delegate1(name); //通過委托調用方法
}
}
}

在客戶端,調用看上去更簡潔一些:

static void Main(string[] args) {

GreetingManager gm = new GreetingManager();

gm.delegate1 = EnglishGreeting;

gm.delegate1 += ChineseGreeting;

gm.GreetPeople("Jimmy Zhang"); //注意,這次不需要再傳遞 delegate1變量

}

輸出為:

Morning, Jimmy Zhang

早上好, Jimmy Zhang

盡管這樣達到了我們要的效果,但是還是存在著問題

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved