委托机制(C#)

附加:委托机制

注意:Java没有委托机制!!

案例:

有一只猫叫TOM,两只老鼠Jerry和Jack,Tom只要叫一声“喵,我是TOM”,两只老鼠就说“猫来了,快跑”然后逃跑。

委托的本质

委托(Handler)是对函数的封装,是一种类,事件标识(event)则是委托的一种特殊形式(注意此处不是Event对象,不负责传递事件信息),是一种特殊的委托类,事件对象则是一个函数。

委托是一种方法的引用,一旦为委托分配了方法,委托将与该方法具有完全相同的行为。

委托的实现(三步):

Ø  Public delegate void CatShoutEventHandler();//委托类的声明,说明创建了一个委托类,是一个函数类,即该类的对象都是函数。

Ø  Public event CatShoutEventHandler CatShout;//事件的声明,即特殊委托类对象CatShout对象的声明;建立了一个CatShout对象,该对象是一个函数的实例,因为委托类是函数的封装,本质是一个函数类。

Event标识是说,如果发生了其他类或对象关注的事情时,委托类或对象(CatShout)可通过事件(EventArg)通知他们

Ø  Cat.CatShout +=new Cat.CatShoutEventHandler(mouse1.run);//给委托分配方法。

具体参见《大话设计模式》附录一中的委托

using System;
using System.Collections.Generic;
using System.Text;

namespace 动物练习
{
    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.CatShoutEventHandler(mouse1.Run);//给委托分配方法。
            cat.CatShout += new Cat.CatShoutEventHandler(mouse2.Run);//给委托分配方法。

            cat.Shout();

            Console.Read();
        }
    }

    //无参数委托事件
    //class Cat
    //{
    //    private string name;
    //    public Cat(string name)
    //    {
    //        this.name = name;
    //    }

    //    public delegate void CatShoutEventHandler();
    //    public event CatShoutEventHandler CatShout;

    //    public void Shout()
    //    {
    //        Console.WriteLine("喵,我是{0}.", name);

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

    //class Mouse
    //{
    //    private string name;
    //    public Mouse(string name)
    //    {
    //        this.name = name;
    //    }

    //    public void Run()
    //    {
    //        Console.WriteLine("老猫来了,{0}快跑!", name);
    //    }
    //}

    //有参数委托事件
    class Cat
    {
        private string name;
        public Cat(string name)
        {
            this.name = name;
        }

        public delegate void CatShoutEventHandler(object sender, CatShoutEventArgs args);//委托类的声明,说明创建了一个委托类,是一个函数类,即该类的对象都是函数。
        public event CatShoutEventHandler CatShout;//事件的声明,即特殊委托类对象CatShout对象的声明;建立了一个CatShout对象,该对象是一个函数的实例,因为委托类是函数的封装,本质是一个函数类。
Event标识是说,如果发生了其他类或对象关注的事情时,委托类或对象(CatShout)可通过事件(EventArg)通知他们


        public void Shout()//1
        {
            Console.WriteLine("喵,我是{0}.", name);

            if (CatShout != null)
            {
                CatShoutEventArgs e = new CatShoutEventArgs();//传递的信息存放在CatShoutEventArgs中,以函数形参的形式传递。
                e.Name = this.name;
                CatShout(this, e);//2
            }
        }
    }

    public class CatShoutEventArgs : EventArgs
    {
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    }

    class Mouse
    {
        private string name;
        public Mouse(string name)
        {
            this.name = name;
        }

        public void Run(object sender, CatShoutEventArgs args)//3
        {
            Console.WriteLine("老猫{0}来了,{1}快跑!", args.Name, name);
        }
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值