首先要规定锦囊里能装什么样的招式(参数和返回值必须匹配)。
// 定义一个委托:能装“没有返回值,接收一个字符串”的招式
public delegate void SendMessage(string msg);
class Messenger
{
public void ByPigeon(string msg)
{
Console.WriteLine("飞鸽传书:" + msg);
}
public void ByHorse(string msg)
{
Console.WriteLine("快马加鞭:" + msg);
}
}
// Main:
Messenger m = new Messenger();
// 1. 把“飞鸽”招式装进委托
SendMessage delegate1 = new SendMessage(m.ByPigeon);
// 2. 调用委托(相当于调用了 ByPigeon)
delegate1("你好!"); // 输出:飞鸽传书:你好!
// 3. 换个招式
delegate1 = m.ByHorse;
delegate1("急报!"); // 输出:快马加鞭:急报!
一个委托里可以装好几个招式!用 += 连接。
SendMessage all = m.ByPigeon;
all += m.ByHorse; // 再加一招
all("进攻!");
// 输出两行:
// 飞鸽传书:进攻!
// 快马加鞭:进攻!
Action(无返回值)和 Func(有返回值)这两个现成的委托,不用自己定义 delegate 了。
使用 Action<string>(系统自带的委托)。
定义两个方法:Attack 和 Retreat。
把它们都绑到一个 Action 上,一次性执行。
Action order;
void Attack(string target) => Console.WriteLine("进攻 " + target);
void Retreat(string target) => Console.WriteLine("撤离 " + target);
order = Attack;
order += Retreat;
order("黑木崖");