思考新方案前,觀察 GreetPeople(string name, Language lang) 簽名。string name 中 string 為參數類型,name 為變量,賦不同值代表不同含義。
若參數能代表方法 呢?命名為 MakeGreeting,調用時傳入 EnglishGreeting 或 ChineseGreeting,方法體內像用普通參數一樣用 MakeGreeting(name)。
改寫:
public void GreetPeople(string name, *** MakeGreeting) {
MakeGreeting(name);
}
關鍵問題:*** 處該填什麼類型?枚舉已不需,因方法內部已區分語言。答案是委托:它定義參數能代表的方法種類(參數類型與返回類型)。
觀察目標方法簽名:
public void EnglishGreeting(string name)
public void ChineseGreeting(string name)
如同 name 只接受 string,委托定義 MakeGreeting 能代表的方法簽名:
public delegate void GreetingDelegate(string name);
與 EnglishGreeting 簽名除 delegate 關鍵字外完全一致。改寫 GreetPeople:
public void GreetPeople(string name, GreetingDelegate MakeGreeting) {
MakeGreeting(name);
}
委托出現位置同 string,確為一類型。實際編譯時委托確會生成類。完整代碼:
using System;
namespace Delegate {
public delegate void GreetingDelegate(string name);
class Program {
private static void EnglishGreeting(string name) { Console.WriteLine("Morning, " + name); }
private static void ChineseGreeting(string name) { Console.WriteLine("早上好, " + name); }
private static void GreetPeople(string name, GreetingDelegate MakeGreeting) { MakeGreeting(name); }
static void Main() {
GreetPeople("Jimmy Zhang", EnglishGreeting);
GreetPeople("張子陽", ChineseGreeting);
Console.ReadKey();
}
}
}