C# 中的委托

委托的定义:

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();
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_41577191/article/details/81075499