©©©©©©【戒指】帮看下这段代码的精华所在©©©©©©

戒指 2011-01-26 04:22:24
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DelegateTest
{
public class Cat
{
private string _name = string.Empty;

public delegate void CatShoutEventHandle();

public event CatShoutEventHandle CatShout;

public Cat(string name)
{
_name = name;
}

public void Shout()
{
Console.WriteLine("吼,我是{0}.", _name);

if (CatShout != null)
{
CatShout();
}
}
}

public class Mouse
{
private string _name = string.Empty;

public Mouse(string name)
{
_name = name;
}

public void Run()
{
Console.WriteLine("死猫来了,{0}快撤!", _name);
}
}

class Program
{
static void Main(string[] args)
{
Cat cat = new Cat("Tom");
Mouse mouse1 = new Mouse("Jerry");
Mouse mouse2 = new Mouse("Jack");

cat.CatShout += new Cat.CatShoutEventHandle(mouse1.Run);
cat.CatShout += new Cat.CatShoutEventHandle(mouse2.Run);

cat.Shout();

Console.Read();
}
}
}
...全文
234 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
沧海遗珠 2011-01-27
  • 打赏
  • 举报
回复
神马都是浮云!
大飞飞虫 2011-01-27
  • 打赏
  • 举报
回复
楼上的

public delegate void CatShoutEventHandle();
加个 object sender 即可,常用方案
Laputa_Island 2011-01-27
  • 打赏
  • 举报
回复

cat.CatShout += new Cat.CatShoutEventHandle(mouse1.Run);
cat.CatShout += new Cat.CatShoutEventHandle(mouse2.Run);


好吧,我承认我很无聊,但是可怜的jerry与jack无法区分是哪一只猫在叫,如果同时有多只猫,并且有一只猫是老鼠打入敌方阵营的特务的话。。 。。
  • 打赏
  • 举报
回复
自动有了泛型 --> 自从有了泛型

不必模仿.net中原来的那些 xxxEventHandler 的写法单独定义一个类型,使用 Action<A,B,C....> 就可以。

连原来的EventHandler也出了一个EventHandler<E>新的方法,可以简化写法。
  • 打赏
  • 举报
回复
猫叫了,耗子跑了。就是用这个 Main 一眼就看出来了。而在Cat中定义一个 public event CatShoutEventHandle CatShout 语句非常轻松。

实际上,没有必要定义一个EventHandler类型。自动有了泛型,更简化了。可以定义为:

public event Action CatShout

就行了。


而假设猫的Shout中通知自己是谁(只有耗子不认识这只猫时才跑,否则不跑),那么猫的事件可以另外定义为:

public event Action<string> CatShout2

而耗子可以这样处理:

cat.CatShout += new Cat.CatShoutEventHandle(Cat.Run2);

public void Run2(string catName)
{
if(catName=="张三")
Console.WriteLine("死{1}来了,{0}快撤!", _name, catName);
}
  • 打赏
  • 举报
回复
在设计模式中,这用了几乎半本书来写。因为设计模式的作者当时不懂事件(当时的java编译器没有自动化地处理这个),于是使用各种class、interface来写实际上事件只要一句话就能成文自明的东西。所以设计模式特别繁冗。

如果一个.net程序员就有福了。因为设计模式的半本书,凡是一个对象需要把消息通知给自己的宿主、凡是需要委托一些操作(而自己不知道该干什么)的时候,都可以用“事件驱动”这种简单的模式来一步到位说明白。
wuyq11 2011-01-26
  • 打赏
  • 举报
回复
一个经典的事件与委托示例
这只是 委托和事件的一些很浅显的认识,对于更为深入的理解就实际编程过程中体会
wushang923 2011-01-26
  • 打赏
  • 举报
回复
我 参观者模式嘞~
戒指 2011-01-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 snowdust 的回复:]

观察者模式
[/Quote]

正解!!!
tlzjff 2011-01-26
  • 打赏
  • 举报
回复
猫1叫,老鼠就跑~~
tlzjff 2011-01-26
  • 打赏
  • 举报
回复
命名很规范,看起来很舒服
Snowdust 2011-01-26
  • 打赏
  • 举报
回复
观察者模式
hitlcyu19 2011-01-26
  • 打赏
  • 举报
回复
这个真没法先啥东西 嘿嘿 就是简单的事件委托啊
再见品月 2011-01-26
  • 打赏
  • 举报
回复


事件,委托

有神马精华的呢?
lgz_asp_net 2011-01-26
  • 打赏
  • 举报
回复

public void Run()
{
Console.WriteLine("死猫来了,{0}快撤!", _name);
}

戒指 2011-01-26
  • 打赏
  • 举报
回复

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧