目录
什么是委托?
如何定义和使用委托?
1、声明委托类型
2、实例化委托对象
3、调用委托方法
Hello!大家好!我是努力赚钱买生发水的灰小猿。
“欢迎来到王者荣耀之C#专场”
最近在用C#的委托做开发时,发现委托这个东西实在在深奥,不了解的小伙伴觉得它没有卵用,然而了解的小伙伴却觉得它大有用途,所以今天大灰狼就借助王者荣耀的英雄技能释放机制和大家聊一聊C#中委托的神秘含义…
“干货还有三秒到达战场!”
什么是委托?
委托是C#中的一种构造,比如在C++中有函数指针的概念,允许在运行时选择要调用的函数。虽然C#没有指针,但是C#中委托的作用却和指针类似,在C#中通过使用Delegate类(即委托类),委托实例可以封装属于可调用实例的方法。然后通过委托可以间接的调用一个方法,在委托中包含对方法的引用,使用委托可以在程序运行时动态的设定要调用的方法,所以执行或调用一个委托时,将执行该委托所引用的方法。
在这里要注意一点:“委托类型不是真正的类,它和类存在明显的差异,类可以包含数据,而委托类型包含的只是指向方法的返回类型和参数列表。并且委托类Delegate是密封的,不能从Delegate类中派生委托类型,也不可能从中派生自定义类。”
委托具有以下的特点:
- 委托类似于C/C++函数指针,但它的安全的
- 委托允许将方法作为参数进行传递
- 委托可用于定义回调方法
- 委托可以将多个方法关联在一起,即可以对一个事件调用多个方法
- 委托所指向的方法不需要与委托签名精确匹配
如何定义和使用委托?
定义和使用委托有三个步骤,
声明委托类型→实例化委托对象→调用委托方法
1、声明委托类型
声明委托类型的目的是告诉编译器这种类型代表了哪种类型的方法。
声明委托的语法是:
[修饰符]delegate 返回类型 委托类型名 (参数列表);
修饰符为:public、private、protected等
返回类型为:string、double、int等
在声明一个委托类型时,每个委托类型都描述参数的个数和类型,以及它可以引用的方法的返回类型,每当需要一组新的参数类型或返回类型时都必须声明一个新的委托类型。
比如在王者峡谷中每一个英雄都有至少三个技能,那么在我们点击一技能的时候,到底是释放哪个英雄的技能呢?这里就很好的用到了委托,
如下面代码声明了一个委托类型Skill_one_Delegate,用这个委托来表示所有英雄的一技能释放,该委托类型可以引用无参数并返回void的方法。
[code]//定义一个释放一技能的委托类型public delegate void Skill_one_Delegate();
重点来了!
在这里要注意的一点:在一般情况下,委托类型必须与后面引用的方法具有相同的签名,即委托类型的参数个数、数据类型和顺序以及返回值必须与后面引用的方法一致,否则可能会出现错误!
2、实例化委托对象
在我们声明了委托类型之后,必须创建一个它的实例,即创建委托对象并使之与特定的方法相关联。
也可以说我们是为上面定义的一技能的委托进行实例化并创建特定的方法,在这里我们就可以将每个英雄的一技能作为一个该委托的特定方法。
定义委托对象的语法格式如下:
委托类型名 委托对象名 = new 委托类型名(与之相关联的方法);
如下面我们实例化Skill_one_Delegate委托类型的一个委托对象sOne:
[code]public Skill_one_Delegate sOne; //定义委托对象
另外,委托对象还需要实例化调用的方法,我们为了直观方便起见,通常将这些方法放了一个类中(也可以将这些方法放在程序的Program类中)
现在我们就可以将每个英雄的一技能作为一个方法,将它们全都存放在代表所有英雄一技能的类Skill_one中,如下,我们暂且定义后裔、亚瑟、猴子的一技能在Skill_one类中:
[code]//定义一技能释放类class Skill_one{ //后裔一技能 public static void DuoChongJianShi() { Console.WriteLine(\"多重箭矢\"); } //亚瑟一技能 public static void ShiYueZhiDun() { Console.WriteLine(\"誓约之盾\"); }//猴子一技能public static void HuShenZhouFa(){ Console.WriteLine(\"护身咒法\"); }}
当然在真正的游戏中技能的释放不可能是这样输出的,真正的技能释放一定是有一个指向目标的参数的。
3、调用委托方法
在创建委托对象之后,我们通常将委托对象传递给将调用该委托的其他代码,通过委托对象的名称调用委托对象。其使用语法格式如下:
委托对象名(实参列表);
什么意思呢?大灰狼在这里解释一下,因为每一个委托类型都有与其对应的特定的委托方法嘛,所以我们实例化委托类型之后,当然要实现该委托对应的方法,所以我们可以将要调用的方法传递给委托对象,然后直接用委托对象名加括号就可以启用该方法了,emmm…有些绕了。
还拿英雄技能释放来讲,
在刚才我们定义了后裔、亚瑟、猴子三个英雄的一技能作为Skill_one这个委托的特定方法,然而这个委托Skill_one指的就是所有英雄的一技能,现在我们将这个委托类型用sOne这个委托对象来进行实例化,那么应该如何释放技能呢?
我们知道王者荣耀中每一个英雄都有技能一、技能二、技能三、血量、伤害等属性,在这里我们就可以将这些属性定义成委托类型,在释放某个英雄的某个技能时,我们只需要调用该英雄的这一个委托中对应的这个英雄的技能即可,
所以我们现在就定义一个英雄类Hera,在这个类中我们暂且只定义一个一技能的委托,而这个Hera类当然是所有英雄都有的了。
我们现在以释放的后裔的一技能“多重箭矢”为例,那么我们首先应该使用后裔来实例化英雄Hera这个类,
[code]//定义后裔接收英雄类Hera houyi = new Hera();
然后我们是要释放一技能,那么就调用英雄类中释放一技能的委托,同时在王者荣耀中每个英雄都具有一技能,也就是说在Skill_one这个类中存放了很多个英雄的一技能的方法,那么我们到底调用哪个方法?当然是后裔的DuoChongJianShi()方法了,
所以我们就将Skill_one类中后裔的DuoChongJianShi()方法传递给调用了一技能委托的后裔:
[code] //使用委托方法接收一技能类中该英雄对应的技能 houyi.sOne = Skill_one.DuoChongJianShi;
现在我们完成了后裔一技能的实例化操作,最后就是该技能的释放了,按照委托调用的方法,因为我们已将后裔的一技能传递给后裔的一技能委托,所以我们可以直接调用该委托对象即可:
[code]houyi.sOne(); //释放后裔一技能
结果如下:
最后将完整代码附上,实现分别“释放”后裔、亚瑟、猴子的一技能。
定义一技能释放类:
[code]//定义一技能释放类 class Skill_one { //后裔一技能 public static void DuoChongJianShi() { Console.WriteLine(\"多重箭矢\"); } //亚瑟一技能 public static void ShiYueZhiDun() { Console.WriteLine(\"誓约之盾\"); } //猴子一技能 public static void HuShenZhouFa() { Console.WriteLine(\"护身咒法\"); } }
定义释放一技能的委托和英雄类:
[code]//定义一个释放技能的委托 public delegate void Skill_one_Delegate(); //定义英雄类 class Hera { //在英雄类中实例化委托 public Skill_one_Delegate sOne; }
主类实现英雄一技能的释放:
[code]class Program { static void Main(string[] args) { //定义后裔接收英雄类 Hera houyi = new Hera(); //使用委托方法接收一技能类中该英雄对应的技能 houyi.sOne = Skill_one.DuoChongJianShi; //定义亚瑟接收英雄类 Hera yase = new Hera(); //使用委托方法接收一技能类中该英雄对应的技能 yase.sOne = Skill_one.ShiYueZhiDun; //定义猴子接收英雄类 Hera houzi = new Hera(); //使用委托方法接收一技能类中该英雄对应的技能 houzi.sOne = Skill_one.HuShenZhouFa; houyi.sOne(); //释放后裔一技能 yase.sOne(); //释放亚瑟一技能 houzi.sOne(); //释放猴子一技能 } }
“释放”结果如下:
好啦,保护我方输出!Victory!!!
觉得不错记得点赞关注大灰狼哟!
同时有喜欢Python的小伙伴也可以关注我的微信公众号“灰狼洞主”后台回复“Python笔记”获取Python入门到精通笔记分享和Python常用函数方法速查手册哟!
大灰狼期待与你一同进步!