C#学习之——委托(Delegate)

C#学习之——委托(Delegate)

1.什么是委托

定义:委托可以看作是方法的套壳(我是这么理解的),它可以套住所有符合它尺寸的方法并代替它去使用。

2.如何定义委托

using System;

namespace Demo01 {
    // 定义了一个委托——Delegate01,这个委托可以套住所有返回类型和参数列表与它相同的方法
    public delegate void Delegate01();
    
}

3.委托有什么用

相信很多人刚看到委托的定义时也和我有一样的疑问,委托到底有什么用?它可以代替原方法使用?那我直接使用原方法不好吗?… …

起初我也有这样的疑问,但后来我查阅资料后发现并不是这样的。在有些场景中我们的确需要使用到委托

例如:

  1. LOL中我们可以给技能绑定不同的按键;
  2. 进行回调时我们可以使用委托来进行回调,而不需要写明具体的对象所调用的具体的方法;
  3. 结合事件一起进行使用等等

4.委托的使用场景

我们使用委托来模拟LOL中为英雄技能指定按键:

using System;

/*
对 Program02 的又一种做法
*/
namespace Demo01
{
    // 委托
    public delegate void Key();

    // 技能池
    public class Skill
    {
        // 具体的方法
        public static void QSkill()
        {
            Console.WriteLine("亚索释放了 Q 技能");
        }

        public static void WSkill()
        {
            Console.WriteLine("亚索释放了 W 技能");
        }

        public static void ESkill()
        {
            Console.WriteLine("亚索释放了 E 技能");
        }

        public static void RSkill()
        {
            Console.WriteLine("亚索释放了 R 技能");
        }
    }

    // 每个英雄配备的按键
    public class Hero
    {
        public Key keyQ;
    }

    // 使用按键
    class Use
    {
        public static void Main(String[] args)
        {
            Skill skill = new Skill();
            Hero yasuo = new Hero();
            
            yasuo.keyQ = Skill.QSkill;
            // yasuo.keyQ();
            yasuo.keyQ += Skill.WSkill;
            yasuo.keyQ();
            yasuo.keyQ -= Skill.QSkill;
            yasuo.keyQ();

        }

    }

}

这样看其实也还是很懵,但我们可以想象如果不使用委托来指定按键,那么英雄释放并更换按键就需要这么几步:

  1. 在游戏逻辑类中定义相应英雄类的对象并使用”对象名.方法名”的方式来进行调用方法;
  2. 若需要更改按键,就需要在逻辑类中更改方法名;
  3. 若使用其他英雄,则需要在逻辑类中添加新的对象名使用新的方法名。

若使用了委托:

  1. 在英雄类中指定逻辑类中的委托具体代表着什么样的方法;
  2. 如需要更改按键,只需要在逻辑类中更改委托所指定的方法;
  3. 若使用其他英雄,也不需要在逻辑类中添加新的对象名使用新的方法名。

OK,其实我也正在学习,写这个主要还是为了巩固自己所学的。

如果您看到了这里还没走的话我还是非常的感谢您,谢谢!

你可能感兴趣的:(笔记,c#)