上篇总结了使用事件来使委托得到更好的封装性,还能限制含有事件的类型的能力,总觉得理解的不够好,索性又看了看别的资料,再做一个例子,好好理解一下事件如何获得更好的封装性
事件在类中声明且生成,且通过使用同一个类或其他类中的委托与时间处理程序关联。包含时间的类用于发布事件。被称为发布器publisher类。其他接受该事件的类被称为订阅器subscriber类。事件使用发布-订阅(publisher-subscriber)模型
更好的封装性体现在:事件应该由发布者触发,而不应该由事件的客户端来触发
DEMO
public delegate void NumberChangedEventHandler(int count);
//定义事件发布者
public class Publishser
{
private int count;
public NumberChangedEventHandler NumberChanged;//声明一个委托变量
//public event NumberChangedEventHandler NumberChanged;//声明一个事件
public void DoSomething()
{
//完成一些工作
if (NumberChanged != null) {
count++;
NumberChanged(count);
}
}
}
public class Subscriber
{
public void OnNumberChanged(int count)
{
Console.WriteLine("Subscriber notified:count={0}", count);
}
}
class Program
{
static void Main(string[] args)
{
Publishser pub = new Publishser();
Subscriber sub = new Subscriber();
pub.NumberChanged += new NumberChangedEventHandler(sub.OnNumberChanged);
pub.DoSomething();//应该通过DoSomething来触发事件
pub.NumberChanged(100);//也可以直接调用,对委托变量的不恰当使用
}
}
这时候我们在客户端是可以直接使用发布者类中的委托变量来触发事件的也就是直接调用pub.NumberChanged(100),但是其实这是不恰当的用法,这将会影响到所有注册了该委托的订阅者。我们应该使用publisher类中的doSomething去触发。
我们再看看使用了event之后会是什么效果