1. 委托(delegate)
先写最重要的一点! 委托并不是函数! 虽然长得很像, 但是委托是一个类! 它定义了方法的类型, 使该方法可以被当成参数来进行传递或者调用. 使用委托时必须像使用类一样, 创建实例后才能使用 ! 委托中重载了 “+=” 和 " -=" 运算符使得委托可以通过这两个运算符来实现对方法的绑定和解绑定, 但是第一次赋值时需要使用 “=” 或者在实例时就进行赋值, 否则会有语法错误.
代码来了!
public delegate void GoodDel(string str); //委托的定义,用delegate关键字
public class GoodClass
{
/// 与委托关联的方法的签名需要和委托声明的签名一致
void GoodFunc(string str)
{
Console.WriteLine(str + "is good");
}
void GreatFunc(string str)
{
Console.WriteLine(str + "is great");
}
private void Start()
{
//GoodDel gd = new GoodDel();
//gd += GoodFunc; 这样写会报语法错误
GoodDel gd = new GoodDel(GoodFunc);
gd("C#");
// C# is good
gd += GreatFunc;
gd("C++");
// C++ is good
// C++ is great
gd -= GoodFunc;
gd("C");
// C is Great
}
}
2.事件(event)
为了实现更好的封装性, 事件便出现了, 如果说委托是对方法的的封装, 事件就是对委托的封装. 事件自身就是委托类型, 使用关键字event来进行声明.
代码来了!
public class GoodClass
{
public delegate void GoodHandler(string str); //定义一个委托类型
public event GoodHandler GoodEvent; //声明一个对应委托类型的事件
public void GoodFunc() //某个触发事件的函数
{
GoodEvent("C# and C++");
}
}
public class GreatClass
{
private void OnHandleEvent(string str) //要和事件绑定的函数, 潜规则是On开头
{
Console.WriteLine(str + "is good");
}
private void Start()
{
GoodClass gc = new GoodClass();
gc.GoodEvent += OnHandleEvent; //事件注册直接直接用+=,解除用-=
gc.GoodFunc();
}
}
3. 委托和事件的作用
委托 + 事件其实构成了设计模式中的观察者模式, 即当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
在GUI环境里面, 所有的控件的状态变更都能触发事件, 如当点击按钮,触发了点击事件后, 按钮就变成了事件发布者, 发布事件的类(按钮)本身对怎样处理事件不感兴趣, 也不会在意谁订阅了事件, 怎么响应这个事件, 它只负责广播通知自己被点击了这个事件已经触发. 订阅了点击按钮这个事件的类被称为订阅者, 会响应这个事件, 调用自己类内部订阅了该事件的函数。
代码来了! 只实现个大概意思!
public class GoodClickComponent
{
public delegate void OnClickDel();
private event OnClickDel OnClick; //声明为对应委托类型的事件
public void AddListener(OnClickDel action)
{
OnClick += action;
}
public void Invoke()
{
if (OnClick != null)
{
OnClick();
}
}
}
public class GoodButton : IPointerClickHandler
{
public GoodClickComponent onClick = new GoodClickComponent();
public void OnPointerClick(PointerEventData eventData)
{
onClick.Invoke();
}
}
public class Game
{
private void Start()
{
var btn = new GoodButton();
btn.onClick.AddListener(() =>
{
Console.WriteLine("This is a good btn");
});
}
}