場景描述
貓和老鼠:貓來了,老鼠跑掉!怎么實現?
實現代碼
之前實現方式:
1
public
class Cat
2 {
3
4 public void ScreamOut( string msg)
5 {
6 mouse.RunAway();
7 }
8 }
9 public class Mouse
10 {
11
12 public void RunAway()
13
14
15 }
2 {
3
4 public void ScreamOut( string msg)
5 {
6 mouse.RunAway();
7 }
8 }
9 public class Mouse
10 {
11
12 public void RunAway()
13
14
15 }
但是如果老鼠繁殖多了,很多老鼠同時都要跑掉,有的向南有的向北,怎么辦呢?重寫貓的ScreamOut 方法,這樣顯然不好;
現實中的情況是,每個老鼠聽到貓來了這個情況,自己有自己的逃跑方式,於是委托用到了這里,即:委托相當於一個方法 但是它的參數也是一個方法,這就不能用一般的方法那樣定義了;
委托實現如下:
貓類:
1
public
class Cat
2 {
3 public string Name { get; set; }
4 public delegate void ScreamEventHandler( object sender, ScreamEventArgs e);
5 public event ScreamEventHandler Scream;
6 public virtual void OnScream(ScreamEventArgs e)
7 {
8 if ( this.Scream != null)
9 {
10 this.Scream( this, e);
11 }
12 }
13 public void ScreamOut( string msg)
14 {
15 ScreamEventArgs e = new ScreamEventArgs(msg);
16 OnScream(e);
17 }
18 }
3 public string Name { get; set; }
4 public delegate void ScreamEventHandler( object sender, ScreamEventArgs e);
5 public event ScreamEventHandler Scream;
6 public virtual void OnScream(ScreamEventArgs e)
7 {
8 if ( this.Scream != null)
9 {
10 this.Scream( this, e);
11 }
12 }
13 public void ScreamOut( string msg)
14 {
15 ScreamEventArgs e = new ScreamEventArgs(msg);
16 OnScream(e);
17 }
18 }
鼠類:
1
public
class Mouse
2 {
3 public string Name { get; set; }
4 public Mouse(Cat cat)
5 {
6 cat.Scream += new Cat.ScreamEventHandler(cat_Scream);
7 cat.Scream += this.RunAway;
8 }
9 public void RunAway( object sender, ScreamEventArgs e)
10 {
11 Cat c = (Cat)sender;
12 Console.WriteLine( " {0} coming,she said:\"{1}\",{2} running!(Running...) ", c.Name, e.Msg, this.Name);
13 }
14 void cat_Scream( object sender, ScreamEventArgs e)
15 {
16 Cat c = (Cat)sender;
17 Console.WriteLine( " {0} coming,she said:\"{1}\",{2} running! ", c.Name, e.Msg, this.Name);
18 }
19
20 }
3 public string Name { get; set; }
4 public Mouse(Cat cat)
5 {
6 cat.Scream += new Cat.ScreamEventHandler(cat_Scream);
7 cat.Scream += this.RunAway;
8 }
9 public void RunAway( object sender, ScreamEventArgs e)
10 {
11 Cat c = (Cat)sender;
12 Console.WriteLine( " {0} coming,she said:\"{1}\",{2} running!(Running...) ", c.Name, e.Msg, this.Name);
13 }
14 void cat_Scream( object sender, ScreamEventArgs e)
15 {
16 Cat c = (Cat)sender;
17 Console.WriteLine( " {0} coming,she said:\"{1}\",{2} running! ", c.Name, e.Msg, this.Name);
18 }
19
20 }
這里的委托定義和.net Framework 類庫定義方式相同,有助於了解系統提供的委托機制,所以還有一個貓叫事件的參數類:
1
public
class ScreamEventArgs
2 {
3 public readonly string Msg;
4 public ScreamEventArgs( string msg)
5 {
6 this.Msg = msg;
7 }
2 {
3 public readonly string Msg;
4 public ScreamEventArgs( string msg)
5 {
6 this.Msg = msg;
7 }
8 }
主類調用代碼:
1
class Program
2 {
3 static void Main( string[] args)
4 {
5 Cat c1 = new Cat();
6 c1.Name = " tom ";
7
8 Mouse m1 = new Mouse(c1);
9 m1.Name = " Jearry ";
10
11 Mouse m2 = new Mouse(c1);
12 m2.Name = " Jearry's son ";
13
14 c1.Scream += m2.RunAway;
15
16 c1.ScreamOut( " stop ");
17
18 Console.Read();
19 }
2 {
3 static void Main( string[] args)
4 {
5 Cat c1 = new Cat();
6 c1.Name = " tom ";
7
8 Mouse m1 = new Mouse(c1);
9 m1.Name = " Jearry ";
10
11 Mouse m2 = new Mouse(c1);
12 m2.Name = " Jearry's son ";
13
14 c1.Scream += m2.RunAway;
15
16 c1.ScreamOut( " stop ");
17
18 Console.Read();
19 }
20 }
執行結果:
源代碼: