清澈的小河边有一棵木瓜树。有一天,小兔子来到河边玩,突然听见“咕咚”一声。吓得小兔子赶紧就跑,边跑边喊“咕咚来了!”这时候,森林里的小动物们都听见啦!小羊,小猪,小马,都边跑边喊“咕咚来啦!”
事件的类型是委托。事件由两部分组成,触发器和订阅器。
小兔子听见“咕咚”的声音,触发了所有小动物的呼喊。
首先定义委托 :
public delegate void GuDongDelegate();
触发器类:
1.在触发器中声明事件,使用event关键字。在protected方法里判断,事件是否为空,否则触发事件。
public class ListeningGudong
{
public event GuDongDelegate guDongEvent;
protected virtual void isGuDongComing()
{
GuDongDelegate guDong = guDongEvent;
if(guDong!=null)
{
guDong();
}
}
}
2.在触发器类中定义方法,用以调用protected方法,而触发事件:
public void ListenGudongCome(string name)
{
Console.WriteLine(name+"听见咕咚来了!");
isGuDongComing();
}
订阅器类:
1.如果事件被触发,且该对象有订阅事件,则要执行订阅器里面的处理程序:
public class TellOthers
{
private string Name;
public ListeningGudong(string name)
{
this.Name = name;
}
public void animalAction()
{
Console.WriteLine(Name+"大喊,快跑呀!咕咚来了!");
}
}
主程序:
var gudong = new ListeningGudong();//实例化触发器
var xiaotu = new TellOthers("小兔");//实例化订阅器
var xiaozhu = new TellOthers("小猪");
var xiaoyang = new TellOthers("小羊");
var xiaoma = new TellOthers("小马");
gudong.guDongEvent += xiaozhu.animalAction;//订阅事件
gudong.guDongEvent += xiaotu.animalAction;
gudong.guDongEvent += xiaoyang.animalAction;
gudong.guDongEvent += xiaoma.animalAction;
gudong.ListenGudongCome("小兔");//小兔听见,触发事件
执行结果:
取消订阅,用“-”符号就行,第二次,小羊取消订阅,所以第二次小羊没喊:
gudong.guDongEvent += xiaotu.animalAction;
gudong.guDongEvent += xiaozhu.animalAction;
gudong.guDongEvent += xiaoyang.animalAction;
gudong.guDongEvent += xiaoma.animalAction;
gudong.ListenGudongCome("小兔");
gudong.guDongEvent -= xiaoyang.animalAction;//取消订阅
gudong.ListenGudongCome("小兔");