C# 委托探索猫和老鼠
最编程
2024-05-04 09:40:01
...
场景描述
猫和老鼠:猫来了,老鼠跑掉!怎么实现?
实现代码
之前实现方式:
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 }
执行结果:
源代码:
委托探索之猫和老鼠源代码
下一篇: 1728.猫和老鼠 II》暴力记忆搜索