CatShoutEventArgs 类:猫叫事件参数类,目前的属性只有猫的name
//EventArgs是包含事件数据的类的父类,作用是事件触发时传递数据
class CatShoutEventArgs : EventArgs
{
private string name;
public string Name
{
get{
return name;}
set {
name = value; }
}
}
Cat类:猫一叫,老鼠就跑
class Cat
{
private string name;
public Cat(string name)
{
this.name = name;
}
//sender:发送通知让老鼠快跑的那个对象,其实还是老猫
//agrs:所有接收者需要附件的信息,这里是老猫的名字
public delegate void CatShoutEventHandler(object sender, CatShoutEventArgs args);
public event CatShoutEventHandler CatShout;
public void Shout()
{
Console.WriteLine("喵,我是{0}", name);
if (CatShout !=null)
{
//声明并实例化一个CatShoutEventArgs对象e
CatShoutEventArgs e = new CatShoutEventArgs();
//赋值老猫的名字
e.Name = this.name;
//事件触发时,通知所有登记过的对象,并将发送通知的自己(老猫的名字),和老鼠Run需要的数据传递过去(这里需要的还是老猫的名字)
CatShout(this, e);
}
}
}
Mouse类:边跑边喊 “老猫xx来了,xx(自己的名字)快跑!”
class Mouse
{
private string name;
public Mouse(string name)
{
this.name=name;
}
//object sender:通知者的对象(老猫的名字)
//CatShoutEventArgs args:所有接收者需要附件的信息(老鼠1和老鼠2的方法Run都需要老猫的名字,所以这里是两遍老猫的名字)
public void Run(object sender,CatShoutEventArgs args)
{
Console.WriteLine("老猫{0}来了,{1}快跑",args.Name ,name);
}
}
客户端:
static void Main(string[] args)
{
Cat cat = new Cat("Tom");
Mouse mouse1 = new Mouse("Jerry");
Mouse mouse2 = new Mouse("Jack");
//将老鼠的Run方法通过实例化了的委托Cat.CatShoutEventHandler,登记到猫的实践CatShout当中。
//委托是一个类,可以实例化,委托是对函数的封装,实例成了一个具体的函数
cat.CatShout += new Cat.CatShoutEventHandler(mouse1 .Run );
cat.CatShout += new Cat.CatShoutEventHandler(mouse2 .Run );
//Shout();方法里包含了对事件CatShout的操作,这里就触发了事件CatShout,紧接着方法Shout()就会委托Cat.CatShoutEventHandler通知老鼠的方法Run跟着运行。
cat.Shout();
}