要想彻底理解委托是什么,我觉得读者可以先去看一下c语言中的指针函数。委托的实质就是指针函数。
using System;
//delegate 委托的关键字 ,其实也是声明指针函数的关键字。
//声明一个委托
delegate void TestDelegate();
class Program
{
public static void Main(String[] args)
{
//实例化一个委托对象需要用一个方法来实例化
//这个方法的返回值类型和参数列表需要保持一致
TestDelegate a = new TestDelegate(testMethod);
// TestDelegate a = testMethod;
//a其实就是一个方法
a();
}
public static void testMethod()
{
Console.WriteLine("TestMethod TInvok");
}
}
下面是一个游戏的例子。
using System;
using System.Numerics;
//将技能和英雄进行分离 , 进而整体降低了代码的耦合性;
//LoL
// 存放所有的技能
public static class Skills {
public static void Dabaojian()
{
Console.WriteLine("大宝剑");
}
public static void NaoCanpi()
{
Console.WriteLine("脑残片");
}
}
public delegate void SkillDelegate();
public class Hero
{
public SkillDelegate q;
}
public class Program
{
public static void Main(String[] args)
{
Hero gaylun = new Hero();
gaylun.q = Skills.Dabaojian;
Hero libai = new Hero();
libai.q = Skills.NaoCanpi;
gaylun.q();
libai.q();
}
}
从上例子可以看出,当类的方法调用不确定的时候,不同的对象调用这个方法产生不同的效果,可以使用委托声明一个变量(函数指针)。
从上可以看出,将英雄和技能进行分离,使用委托可以产生上面的需求。进而极大的降低了代码的耦合性。
使用接口也可以实现,但是,我们要对每个英雄建立一个类,每个类要重写所有的技能,这样实现起来是比较麻烦的!
补充一
带返回值和参数的委托
public delegate int CalculateMenthod(int x , int y);
public class Program {
public static void Main(string[] args)
{
CalculateMenthod add = addmethod;
int resault = add(1, 2);
Console.WriteLine($"resault = {resault}");
}
public static int addmethod(int x ,int y)
{
return x + y;
}
}
补充二
组合委托
在游戏开发中,组合委托可用于联合技能的释放。
public delegate void TestDelegate();
class Program
{
public static void Main(string[] args)
{
TestDelegate method = methodA;
method += methodB;
//method();
method -= methodA;
method();
}
public static void methodA()
{
Console.WriteLine("i am methodA");
}
public static void methodB()
{
Console.WriteLine("i am methodB");
}
}