//源碼參考《大話設計模式》--清華大學出版社 程傑 著
using System;
using System.Collections.Generic;
using System.Text;
namespace 委托和事件
{
class Program
{
static void Main(string[] args)
{
//執行個體化貓Tom和老鼠Jerry和Jack
Cat cat = new Cat("Tom");
Mouse mouse1 = new Mouse("Jerry");
Mouse mouse2 = new Mouse("Jack");
//将Mouse的Run方法,通過執行個體化委托Cat.CatShoutEventHandler登記到Cat的CatShout事件當中。其中“+=”表示增加委托執行個體對象,即"add_CatShout"
cat.CatShout += new Cat.CatShoutEventHandler(mouse1.Run);
cat.CatShout += new Cat.CatShoutEventHandler(mouse2.Run);
cat.Shout();
Console.WriteLine("\r");
Cat1 cat1 = new Cat1("(有參)貓");
Mouse1 mouse3 = new Mouse1("(有參)Jerry");
Mouse1 mouse4 = new Mouse1("(有叁)Jack");
//寫法不變
cat1.CatShout += new Cat1.CatShoutEventHandler(mouse3.Run);
cat1.CatShout += new Cat1.CatShoutEventHandler(mouse4.Run);
cat1.Shout();
Console.Read();
}
}
//無參數委托事件
class Cat
{
private string name;
public Cat(string name)
{
this.name = name;
}
//申明無參數委托 CatShoutEventHandler
public delegate void CatShoutEventHandler();
//申明事件CatShout,它的類型是委托CatShoutEventHandler
public event CatShoutEventHandler CatShout;
public void Shout()
{
Console.WriteLine("喵,我是{0}.", name);
if (CatShout != null)
{
//由于CatShout的類型是委托CatShoutEventHandler()(無參數),是以CatShout()也是無參數,無傳回值的,有參數的情況見下面的示例
CatShout();//當執行Shou()方法時,若CatShou中有對象登記事件,則執行CatShout()方法
}
}
}
class Mouse
{
private string name;
public Mouse(string name)
{
this.name = name;
}
public void Run()
{
Console.WriteLine("老貓來了,{0}快跑!", name);
}
}
//有參數委托事件
//增加一個新類,繼承EventArgs。作用:在事件觸發時,傳遞資料。
public class CatShoutEventArgs : EventArgs //EventArgs:包含事件資料的類的基類
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
}
class Cat1
{
private string name;
public Cat1(string name)
{
this.name = name;
}
//申明有參數的委托 object對象 sender是指向發送通知的對象;CatShoutEventArgs的 args包含了所有知道接收都所需要附件的資訊
public delegate void CatShoutEventHandler(object sender, CatShoutEventArgs args);
public event CatShoutEventHandler CatShout;
public void Shout()
{
Console.WriteLine("喵,我是{0}.", name);
if (CatShout != null)
{
CatShoutEventArgs e = new CatShoutEventArgs();//申明并執行個體化一個CatShoutEventArgs
e.Name = this.name; //給name屬性指派為貓的名字
CatShout(this, e);//當事件觸發時,通過所有登記過的對象,并将發送通知的自己和所需要的資訊傳遞過去
}
}
}
class Mouse1
{
private string name;
public Mouse1(string name)
{
this.name = name;
}
//增加兩個參數,以便接收貓的名字
public void Run(object sender, CatShoutEventArgs args)
{
Console.WriteLine("老貓{0}來了,{1}快跑!", args.Name, name);
}
}
}