運行無誤,輸出雙語問候。若需將多方法綁定同一委托:
static void Main() {
GreetingManager gm = new GreetingManager();
GreetingDelegate delegate1;
delegate1 = EnglishGreeting;
delegate1 += ChineseGreeting;
gm.GreetPeople("Jimmy Zhang", delegate1);
}
輸出兩次 "Jimmy Zhang"。為方便客戶端,嘗試將委托封裝進 GreetingManager:
public class GreetingManager {
public GreetingDelegate delegate1;
public void GreetPeople(string name, GreetingDelegate MakeGreeting) {
MakeGreeting(name);
}
}
客戶端:
gm.delegate1 = EnglishGreeting;
gm.delegate1 += ChineseGreeting;
gm.GreetPeople("Jimmy Zhang", gm.delegate1);
調用時仍需傳遞 gm.delegate1 顯得多餘。改進:
public class GreetingManager {
public GreetingDelegate delegate1;
public void GreetPeople(string name) {
if (delegate1 != null) delegate1(name);
}
}
客戶端簡化為 gm.GreetPeople("Jimmy Zhang")。但仍存問題:delegate1 為 public 欄位,客戶端可任意賦值破壞封裝,且 =/+= 語法不一致。