我竟然用它搞懂了王者荣耀的技能释放机制!【C#委托】

简介: 我竟然用它搞懂了王者荣耀的技能释放机制!【C#委托】

目录

什么是委托?

如何定义和使用委托?

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的方法。

//定义一个释放一技能的委托类型
public delegate void Skill_one_Delegate();

重点来了!

在这里要注意的一点:在一般情况下,委托类型必须与后面引用的方法具有相同的签名,即委托类型的参数个数、数据类型和顺序以及返回值必须与后面引用的方法一致,否则可能会出现错误!

2、实例化委托对象

在我们声明了委托类型之后,必须创建一个它的实例,即创建委托对象并使之与特定的方法相关联。

也可以说我们是为上面定义的一技能的委托进行实例化并创建特定的方法,在这里我们就可以将每个英雄的一技能作为一个该委托的特定方法。

定义委托对象的语法格式如下:

委托类型名 委托对象名 = new 委托类型名(与之相关联的方法);

如下面我们实例化Skill_one_Delegate委托类型的一个委托对象sOne:

public Skill_one_Delegate sOne; //定义委托对象

另外,委托对象还需要实例化调用的方法,我们为了直观方便起见,通常将这些方法放了一个类中(也可以将这些方法放在程序的Program类中)

现在我们就可以将每个英雄的一技能作为一个方法,将它们全都存放在代表所有英雄一技能的类Skill_one中,如下,我们暂且定义后裔、亚瑟、猴子的一技能在Skill_one类中:

//定义一技能释放类
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这个类,

//定义后裔接收英雄类
Hera houyi = new Hera();

然后我们是要释放一技能,那么就调用英雄类中释放一技能的委托,同时在王者荣耀中每个英雄都具有一技能,也就是说在Skill_one这个类中存放了很多个英雄的一技能的方法,那么我们到底调用哪个方法?当然是后裔的DuoChongJianShi()方法了,

所以我们就将Skill_one类中后裔的DuoChongJianShi()方法传递给调用了一技能委托的后裔:

//使用委托方法接收一技能类中该英雄对应的技能
houyi.sOne = Skill_one.DuoChongJianShi;

现在我们完成了后裔一技能的实例化操作,最后就是该技能的释放了,按照委托调用的方法,因为我们已将后裔的一技能传递给后裔的一技能委托,所以我们可以直接调用该委托对象即可:

houyi.sOne(); //释放后裔一技能

结果如下:

最后将完整代码附上,实现分别“释放”后裔、亚瑟、猴子的一技能。

定义一技能释放类:

//定义一技能释放类

class Skill_one
{
    //后裔一技能
    public static void DuoChongJianShi()
    {
        Console.WriteLine("多重箭矢");
    }

    //亚瑟一技能
    public static void ShiYueZhiDun()
    {
        Console.WriteLine("誓约之盾");
    }

    //猴子一技能
    public static void HuShenZhouFa()
    {
        Console.WriteLine("护身咒法");
    }

}

定义释放一技能的委托和英雄类:

//定义一个释放技能的委托

public delegate void Skill_one_Delegate();

//定义英雄类
class Hera
{
    //在英雄类中实例化委托
    public Skill_one_Delegate sOne;
}

主类实现英雄一技能的释放:

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!!!

觉得不错记得点赞关注大灰狼哟!

大灰狼期待与你一同进步!

目录
相关文章
|
3月前
|
存储 C# C++
C#进阶-委托(Delegrate)
类似于 C 或 C++ 中函数的指针,委托是C#的函数指针,是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。本篇文章我们将讲解C#里委托的类型及如何使用。委托的语法第一次接触难免感到陌生,最好的学习方式就是在项目中多去使用,相信会有很多感悟。
26 0
|
4月前
|
Java C# C++
【从Java转C#】第八章:委托、lambda、事件
【从Java转C#】第八章:委托、lambda、事件
|
4月前
|
C#
C#中的委托
C#中的委托
20 0
|
5月前
|
存储 开发框架 .NET
c#委托详解
委托是一种能够将方法作为参数传递、存储方法并且调用方法的类型,它可以让我们写出更加灵活和可扩展的代码。委托通常用于回调 (Callback) 机制,比如在事件处理、异步编程、LINQ 查询等场景中常常会使用委托。它可以将方法作为参数传递给其他方法,从而在需要的时候执行该方法。
27 2
C#编程:如何理解委托-2
C#编程:如何理解委托-2
|
设计模式 前端开发 C#
C#开发中使用委托的作用和好处
先看概念,什么是委托? 从程序的角度来讲:你就可以把委托看成是用来执行方法(函数)的一个“指针” 通俗的说就是:通过委托,我们可以把方法当成参数传递。 这里我举个例子:“设想,如果我们写了一个厨师做菜的方法,里面有拿菜、切菜、配菜、炒菜四个步骤,但编写此方法代码的人想让配菜这个环节让调用方法的人来实现,换句话说,就是想把方法作为参数来传递,那么怎么来实现呢? 方法1:使用接口,这里不是我们讨论的。
7235 0
|
C#
C# 从1到Core--委托与事件(三)
委托与事件在C#1.0的时候就有了,随着C#版本的不断更新,有些写法和功能也在不断改变。本文温故一下这些改变,以及在NET Core中关于事件的一点改变。
142 0
|
C#
C# 从1到Core--委托与事件(二)
 委托与事件在C#1.0的时候就有了,随着C#版本的不断更新,有些写法和功能也在不断改变。本文温故一下这些改变,以及在NET Core中关于事件的一点改变。
148 0
|
C#
C# 从1到Core--委托与事件(一)
 委托与事件在C#1.0的时候就有了,随着C#版本的不断更新,有些写法和功能也在不断改变。本文温故一下这些改变,以及在NET Core中关于事件的一点改变。
179 0
|
C# C++
C#委托11111(上)
C#委托11111
100 0