偶有所得及疑问
所谓回调、事件(event)、委托(delegate)的本质,莫非就是:
event、delegate本身是一个类,它重写了+=运算符,每次+=一个方法,就相当于把这个方法名作为变量传到event、delegate类的内部,保存到内部成员中,当event类被动触发,就调用这些成员。
这里面有个关键,就是一个类(event),如何能把一个方法作为成员变量。这里运用到了接口与其继承的机制,event类可以把一个接口作为自己的成员变量,该接口定义一个成员方法,只描述签名不实现。实现了该接口的类,都实现了该方法,都能作为变量值传进来。event类通过统一的代码(调用接口成员的方法)即可对注册的方法进行调用。
如下代码示例:
public class Resolve
{
//持有一个接口的引用,通过构造方法初始化
private IPlayer player;
public Resolve(IPlayer player)
{
this.player = player;
}
public void Play()
{
player.Play();
}
}
不过这没有完整解释event或delegate的机制,因为C#不像C和C++具有指针的特性,无法将方法的指针作为变量传递,而event、delegate可以通过+=操作符直接将方法名传进去,而不用包成对象再传。关于其完整机制,待了解后再补充。
写的乱七八糟,不知自己下次看能否看懂自己在说什么。。