首页 > 编程 > .NET > 正文

一个男人和三个女人的故事[《.net框架程序设计》读书笔记_第十一章 多事件示例]

2024-07-10 13:03:24
字体:
来源:转载
供稿:网友
  • 网站运营seo文章大全
  • 提供全面的站长运营经验及seo技术!
  • 第十一章 多事件示例[一个男人和三个女人的故事]

    摘要:

    应用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框架程序设计》读书笔记_第十一章 事件
    发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表