委托与事件

转自:C# 委托和事件 与 观察者模式(发布-订阅模式)讲解 by天命 - 天天天命 - 博客园 

委托:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        { 
            #region 这种方式:Cat 同时依赖Rat和指定的方法
            Cat cat = new Cat();
            Rat rat1 = new Rat("Jerry");
            Rat rat2 = new Rat("TaoQi");
            cat._whichObjectAndMethods += rat1.Run;//指定rat和它的run方法
            cat._whichObjectAndMethods += rat2.Run;//指定rat和它的run方法
            #endregion
            #region 这种方式:Cat 只是依赖Rat,不依赖Rat的方法
            //Cat cat = new Cat();
            //Rat rat1 = new Rat("Jerry");
            //Rat rat2 = new Rat("TaoQi");
            //cat.rat1 = rat1;
            //cat.rat2 = rat2;
            #endregion

            //调用cat的Shout方法
            cat.Shout();
            Console.ReadKey();
        }
    }


    //定义一个委托 whichObjectAndMethods 没有返回值 参数列表为空
    public delegate void whichObjectAndMethods();

    //猫类
    public class Cat    {
        public Cat() {

        }
        //委托:同时依赖类和方法
        public whichObjectAndMethods _whichObjectAndMethods { set; get; }
        
        //非委托:仅仅依赖类
        //public Rat rat1 { set; get; }
        //public Rat rat2 { set; get; }

        public void Shout()
        {
            Console.WriteLine("喵喵喵");
            _whichObjectAndMethods();//这里调用之前指定的所有方法

            //rat1.Run();
            //rat2.Run();
            //rat1.other("a");//非委托时,可以调用其他方法
            //rat2.other("b");//非委托时,可以调用其他方法
        }
    }

    //老鼠类
    public class Rat
    {
        public string Name { get; set; } //老鼠的名字

        //老鼠的逃跑方法
        public void Run()
        {
            Console.WriteLine(Name + "跑了!");
        }

        public void other(string p) {
            Console.WriteLine(Name + "接收到的参数是:!"+p);
        }

        //无参和带参构造
        public Rat() { }
        public Rat(string name)
        {
            this.Name = name;
        }
    }
}

事件:


using System;

/// <summary>
/// 需要向被触发的类传递什么数据,可以写在这里
/// </summary>
public class CatShoutEventArgs : EventArgs
{
    public string CatName { get; set; }
    public CatShoutEventArgs(string name)
    {
        this.CatName = name;
    }
}

public delegate void CatShoutEventHandler
            (object sender, CatShoutEventArgs e);

//猫类
public class Cat
{
    public string Name { get; set; } //猫的名字

    /*好像有没有event关键字都是一样的*/
    public event CatShoutEventHandler whichclassAndEvents;



    public void Shout()
    {
        Console.WriteLine("喵喵喵");
        //判断委托内是否为空,若不为空,执行该委托
        if (whichclassAndEvents != null)
        {
            //new一个CatShoutEventArgs类,传入参数是自身的Name
            CatShoutEventArgs e = new CatShoutEventArgs(Name);
            //执行CatShout事件,传入自身和e
            whichclassAndEvents(this, e);
        }
    }

    //无参和带参构造
    public Cat() { }
    public Cat(string name)
    {
        this.Name = name;
    }
}

//老鼠类
public class Rat
{
    public string Name { get; set; } //老鼠的名字

    //sender指调用run事件方法的类,这里例子是Cat,
    //事件跟委托的区别是事件可以知道是谁调用了方法,但是单纯的委托是不知道的。
    //比如听到声音,事件的方式,老鼠可以知道是猫发出来的,还是老虎发出来的,
    //单纯的委托是不知道谁发出的
    public void Run(object sender, CatShoutEventArgs e)
    {
        var aa = sender.GetType();//可以通过反射的方式知道是谁触发了该事件
        //打出一句话,包括了猫的名字和老鼠的名字
        Console.WriteLine(e.CatName + "来了! " + Name + "跑了!");
    }

    //无参和带参构造
    public Rat() { }
    public Rat(string name)
    {
        this.Name = name;
    }
}

class EventTest7
{

    static void Main(string[] args)
    {
        //构建一个猫对象和两个老鼠对象
        Cat cat = new Cat("Tom");
        Rat rat1 = new Rat("Jerry");
        Rat rat2 = new Rat("TaoQi");

        //向cat的委托对象CatShout中依次添加老鼠对象的Run方法
        //注!!添加的是整个方法 不需要加括号
        cat.whichclassAndEvents += rat1.Run;
        cat.whichclassAndEvents += rat2.Run;

        //调用cat的Shout方法
        cat.Shout();
        Console.ReadKey();
    }
}

比如客人点菜了,厨房的人看到单据,有的员工洗菜,有的员工切菜,有的员工炒菜,,,,

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值