委托的定义:
delegate(委托)是表示将方法作为参数传递给其他方法.委托类似于函数指针,但与函数指针不同的是,委托是面向对象的,类型安全的和保险的.委托既能引用静态方法,也能引用实例方法
// 现实中的委托
A 委托 B 做一件事情,A 是委托人 B 是受委托人
做事情的是 B,当然 B 可以接受也可以不接受
// 程序中的委托
A(类) 委托 B(类) 做事情(行为即方法),A 委托 B 去触发一个行为.同样 B(类) 可以接受也可以不接受.接收委托叫绑定委托.
class Hello World
{
// 声明一个委托
// 委托代表的是方法,所以它的类型要跟方法一致
// 方法带有参数,委托必须有
public delegate void GreetingDelegate(string name);
public delegate int D1(); // 代表有返回值(返回值为 int 类型),没有参数的方法
public delegate void D2(); // 代表没有返回值,没有参数的方法
public delegate int D3(string name); // 代表有返回值(返回值为 int 类型),有参数(参数为
// string 类型)的方法
public delegate void D4(string name); // 代表没有返回值,有参数(参数为 string 类型)的方法
public void GreetPeople(string name, GreetingDelegate mothod)
{
method.Invoke(name);
}
}
案例:
鸿门宴 : 刘邦去项羽家吃饭,刘邦跟手下樊哙以及韩信商量好一件事情,当我举杯的时候,樊哙就带兵杀进来,韩信外围的部队准备好
// 定义规范韩信和樊哙行为的接口
interface IAction
{
void StartAction(); // 开始行动
void CancelAction(); // 取消活动
}
// 定义 Han 类型,并继承 IAction 接口
class Han : IAction
{
public void StartAction()
{
Console.WtiteLine("刘二狗有难,韩信率部队赶来.....");
}
public void CancelAction()
{
Console.WtiteLine("狗日滴又骗我,撤退.....");
}
}
// 定义 Fan 类型,并继承 IAction 接口
class Fan : IAction
{
public void StartAction()
{
Console.WriteLine("刘二狗有难,樊哙领着旺财赶来....");
}
public void CancelIAction()
{
Console.WriteLine("计划有变,樊哙当场做了红烧肉....");
}
}
class HongMenPractice
{
// 定义摔杯委托
public delegate void BreakCupDelegate();
// 定义取消活动的委托
public delegate void CancelAction();
// 静态的委托变量
static BreakCupDelegate bc;
static CancelAction ca;
// 初始化受委托人的实例
static Han hanxin = new Han();
static Fan fankuai = new Fan();
static HongMenAction()
{
// 绑定韩信的摔杯行为
bc = hanxin.StartAction;
bc += fankuai.StartAction;
// 绑定取消活动的行为
ca = hanxin.CancelAction;
ca += fankuai.StartAction;
}
// 定义求救的行为
public static void SOS()
{
Console.WriteLine("刘邦不小心碰到了杯子,杯子掉在了地上...");
// 执行摔杯的委托;
bc();
}
// 定义取消求救的行为
public static void CancelSOS()
{
Console.WriteLine("杯子没拿住,没事没事...");
// 执行取消活动的委托
ca();
}
}