11.13闲话-委托与事件
前言
其实委托与事件并不是必须品,如果你的码力超群,可以不使用oop、函数便可以切掉猪国杀,那完全不用学习委托与事件。
其作用就像函数、封装类似,为节省大量的无意义代码而诞生。
前言
先考虑为什么使用函数,第一点就是因为我们会多次使用相同的代码,第二点便是我们会使用相似的代码。
而委托事件就非常类似第二点。
不同的是我们会传入一个函数。
考虑我们现在有一个函数,调用会向控制台打印欢迎语。
很显然我们可以直接调用输出。
但现在我们的程序需要国际化,让我们的shit传遍天下。
所以要支持多语言。
我们肯定可以暴力使用if判断不同语言。
但假如我们需要扩展,显然这么做就会使得代码过难维护。
但类比函数的思想,我们为什么不直接把函数当做参数传入另一个函数?
使用
Part.1 委托
public delegate void Greeting_Delegate(string name);
需要注意的是,声明的类型和参数要与函数一致
public void Greet_Others(string name, Greetint_Delegate Greet)
{
Greet(name);
}
public void Greet_English(string name)
{
DeBug.Log("Hello, " + name); // unity 调试方式
}
public void Greet_Chinese(string name)
{
DeBug.Log("你好, " + name);
}
public static void Main()
{
Greet_Others("Shadow", Greet_English);
Greet_Others("涛哥", Greet_Chinese);
}
但是,只能这么做有点过于局限,所以,还可以这么用。
public class Greeting_Manager()
{
public Greet_Delegate Delegate;
public void Greet_Others(string name)
{
if (Delegate != null)
{
Delegate(name);
}
}
}
public static void Main()
{
Greeting_Manager greetManager;
greetManager.Delegate = Greet_English;
greetManager.Delegate += Greet_Chiese;
greetManager.Greet_Others("涛哥");
Delegate("涛哥");
}
但到这总还是感觉缺点什么,为什么呢?
事件
一切都十分完美,但是其缺少了一定的权限,也就是我们的用户可以肆意的修改我们的委托,所以出现了事件。
事件可以使我们的操作只能 += (添加事件) 或 -= (删除事件)。
public class Greeting_Manager()
{
public event Greet_Delegate Delegate;
public void Greet_Others(string name)
{
if (Delegate != null)
{
Delegate(name);
}
}
}
public static void Main()
{
Greeting_Manager greetManager = new Greeting_Manager();
greetManager.Delegate += Greet_English;
greetManager.Delegate += Greet_Chiese;
greetManager.Greet_Others("涛哥");
Delegate("涛哥");
}