我們運行這段代碼,嗯,沒有任何問題。程序一如預料地那樣輸出了:
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
盡管這樣達到了我們要的效果,但是還是存在著問題