欢迎光临
我们一直在努力

一个男人和三个女人的故事[《.net框架程序设计》读书笔记_第十一章 多事件示例]-.NET教程,数据库应用

建站超值云服务器,限时71元/月

第十一章 多事件示例[一个男人和三个女人的故事]

摘要:

应用fcl中的system.componentmodel.eventhandlerlist示例一个类型中发布多事件的应用

场景:一个男生有三个女朋友,各自有不同的爱好,女朋友a爱好音乐,女朋友b爱好美食,女朋友c爱好xxx,为满足各个女朋友,此男生必须进行唱歌、烹饪食物、xxx。

以此制作程序演示单类型多事件的应用,并假设此男同时只能干一件事情(即排除一边xxx一边唱歌或一边xxx一边烹饪的可能j)

如下为源代码:

using system;

using system.componentmodel;

//男朋友的源代码

public class boyfriend

{

protected eventhandlerlist eventlist

= new eventhandlerlist();

//

//满足女朋友a定义音乐喜好

//使用自定义的音乐事件及回调函数

protected static readonly object musiceventkey = new object();

public class musiceventargs : eventargs

{

private string strmusicname;

public string musicname

{

get{

return strmusicname;

}

}

public musiceventargs(string strmusicname)

{

this.strmusicname = strmusicname;

}

}

public delegate void musiceventhandler(object sender, musiceventargs args);

public event musiceventhandler musicmsg

{

add

{

eventlist.addhandler(musiceventkey, value);

}

remove

{

eventlist.removehandler(musiceventkey, value);

}

}

protected virtual void onmusic(musiceventargs e)

{

delegate d = eventlist[musiceventkey];

if(d != null)

{

d.dynamicinvoke(new object[]{this, e});

}

}

public void simulatemusic(string strname)

{

console.writeline("男朋友:好的,我给你唱支{0}吧!", strname);

onmusic(new musiceventargs(strname));

}

//

//满足女朋友b的美食欲望

//

protected static readonly object cateeventkey = new object();

public class cateeventargs : eventargs

{

private string strcatename;

public string catename

{

get

{

return strcatename;

}

}

public cateeventargs(string strcatename)

{

this.strcatename = strcatename;

}

}

public delegate void cateeventhandler(object sender, cateeventargs args);

public event cateeventhandler catemsg

{

add

{

eventlist.addhandler(cateeventkey, value);

}

remove

{

eventlist.removehandler(cateeventkey, value);

}

}

protected void oncate(cateeventargs e)

{

delegate d = eventlist[cateeventkey];

if(d != null)

{

d.dynamicinvoke(new object[]{this, e});

}

}

public void simulatecate(string strcatename)

{

console.writeline("男朋友:请吃一点我做的{0}", strcatename);

oncate(new cateeventargs(strcatename));

}

//

//满足女朋友c的xxx欲望

//使用eventargs.empty事件及system.eventhandler回调函数

protected static readonly object xxxeventkey = new object();

public event eventhandler xxxmsg

{

add

{

eventlist.addhandler(xxxeventkey, value);

}

remove

{

eventlist.removehandler(xxxeventkey, value);

}

}

protected virtual void onxxx()

{

delegate d = eventlist[xxxeventkey];

if(d != null)

{

d.dynamicinvoke(new object[]{this, eventargs.empty});

}

}

public void simulatexxx()

{

console.writeline("男朋友:你今天真漂亮呵!");

onxxx();

}

public static void main()

{

boyfriend bf = new boyfriend();

//

console.writeline("上午 女朋友a来玩:");

gf_a gfa = new gf_a(bf);

bf.simulatemusic("恋曲");

gfa.unregister(bf);

//

console.writeline();

console.writeline("下午 女朋友b来玩");

gf_b gfb = new gf_b(bf);

bf.simulatecate("祖传小甜点");

gfb.unregister(bf);

//

console.writeline();

console.writeline("晚上 女朋友c来玩");

gf_c gfc = new gf_c(bf);

bf.simulatexxx();

gfc.unregister(bf);

}

}

//女朋友a的源代码

public class gf_a

{

public gf_a(boyfriend bf)

{

bf.musicmsg += new boyfriend.musiceventhandler(musicmsg);

console.writeline("女朋友a:老公!我要听歌");

}

private void musicmsg(object sender, boyfriend.musiceventargs args)

{

switch(args.musicname)

{

case "恋曲":

case "清歌":

console.writeline("女朋友a:哇,是{0}耶,好喜欢啊!", args.musicname);

break;

default:

console.writeline("女朋友a:这首歌没听过耶,好好听奥!");

break;

}

}

public void unregister(boyfriend bf)

{

boyfriend.musiceventhandler bfe = new boyfriend.musiceventhandler(musicmsg);

bf.musicmsg -= bfe;

console.writeline("女朋友a: 休息了,别吵!");

}

}

//女朋友b的源代码

public class gf_b

{

public gf_b(boyfriend bf)

{

bf.catemsg += new boyfriend.cateeventhandler(catemsg);

console.writeline("女朋友b: 老公!我饿了!");

}

private void catemsg(object sender, boyfriend.cateeventargs args)

{

switch(args.catename)

{

case "祖传小甜点":

console.writeline("女朋友b: 哇!老公你真能干,{0}好好吃耶!", args.catename);

break;

case "饼干":

case "方便面":

console.writeline("女朋友b: 刚认识你时,给人家做小点心,现在让人家吃方便食品了,555555");

break;

default:

console.writeline("女朋友b: 这是什么东东,没吃过耶");

break;

}

}

public void unregister(boyfriend bf)

{

boyfriend.cateeventhandler e = new boyfriend.cateeventhandler(catemsg);

bf.catemsg -= e;

console.writeline("女朋友b: 吃饱了,谢谢你噢!");

}

}

//女朋友c的源代码

public class gf_c

{

public gf_c(boyfriend bf)

{

bf.xxxmsg += new eventhandler(xxxmsg);

console.writeline("女朋友c: 老公!你今天真帅哦!");

}

private void xxxmsg(object sender, eventargs args)

{

console.writeline("女朋友c: r…o…o…m…");

}

public void unregister(boyfriend bf)

{

eventhandler e = new eventhandler(xxxmsg);

bf.xxxmsg -= e;

console.writeline("女朋友c:累了,想休息了!");

}

}

/*运行结果:

上午 女朋友a来玩:

女朋友a:老公!我要听歌

男朋友:好的,我给你唱支恋曲吧!

女朋友a:哇,是恋曲耶,好喜欢啊!

女朋友a: 休息了,别吵!

下午 女朋友b来玩

女朋友b: 老公!我饿了!

男朋友:请吃一点我做的祖传小甜点

女朋友b: 哇!老公你真能干,祖传小甜点好好吃耶!

女朋友b: 吃饱了,谢谢你噢!

晚上 女朋友c来玩

女朋友c: 老公!你今天真帅哦!

男朋友:你今天真漂亮呵!

女朋友c: r…o…o…m…

女朋友c:累了,想休息了!

*/

注:1、因上例使用fcl中的system.componentmodel.eventhandlerlist,因此不具备线程安全性。

2、上述代码中xxx部分未定义事件参数而是使用system.eventargs.emtpy,也没有定义回调函数而是使用system.eventhandler;其他两个事件都是自定义的。可以修改其他两个事件

3、关于发布事件、自定义事件、多事件定义的详细信息,请参考《.net框架程序设计》读书笔记_第十一章 事件

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 一个男人和三个女人的故事[《.net框架程序设计》读书笔记_第十一章 多事件示例]-.NET教程,数据库应用
分享到: 更多 (0)

相关推荐

  • 暂无文章