C#面向对象编程-类和对象(委托与事件)

文章目录

委托

从数据结构来讲,委托是和类一样,是一种用户自定义类型。委托是方法的抽象,它存储的就是一系列具有相同签名和返回类型的方法的地址。调用委托的时候,委托包含的所有方法将被执行。所有的委托都派生自System.Delegate类。

  1. 声明委托
    委托是类型,就好像类也是类型一样。
  2. 委托的实例化
    一旦声明了委托类型,委托对象必须使用new关键字来创建,且与一个特定的方法有关。当创建委托时,传递到new语句的参数就像方法调用一样书写,但是不带有参数。
    编写程序,实现MrLi委托MrZhang去帮忙买车票的情景。
using System;
//声明一个委托,其实就是个“命令”
public delegate void MyDelegate();
namespace Project19
{
    class MrZhang
    {
        public static void BuyTicket()
        {
            Console.WriteLine("小李又让小张去给他帮忙买车票!");
        }
    }
    class MrLi
    {
        static void Main(string[] args)
        {
            //这里就是具体阐述这个命令是干什么的,本例是MrZhang.BuyTicket“小张买车票”
            MyDelegate myDele = new MyDelegate(MrZhang.BuyTicket);
            //这时候委托被附上了具体的方法
            myDele();
            Console.ReadKey();
        }
    }
}

【程序分析】本例演示了委托的实例化。在代码中,首先声明一个委托MyDelegate;然后在命名空间Project19中,定义两个类分别为MrZhang和MrLi;接着在MrZhang类中定义买车票的方法BuyTicket,在MrLi类的Main方法中,对委托进行实例化,并对其进行调用。

小李又让小张去给他帮忙买车票!
  1. 委托的使用
    编写程序,使用委托引用带有一个整型参数的方法,并返回两个整型值。

【程序分析】本例演示了委托的使用。在代码中,首先声明一个委托NumberChanger,该委托的功能是返回一个带int类型参数的整型方法。接着在Program类中,定义变量num,并赋值为10;定义相加的方法AddMethod,用于计算形参a与num的和;定义相乘的方法MultMethod,用于计算形参b与num的乘积;再定义getNum方法,用于返回num的值。最后创建委托的对象nc1和nc2,并注册AddMethod和MultMethod方法。


  1. 委托的多播
    委托对象可使用“+”运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。“-”运算符可用于从合并的委托中移除组件委托。委托也可以包含多个方法,这种委托称为多播委托,也叫组播。
    编写程序,实现委托的多播。
using System;
public delegate int NumberDelegate(int num1, int num2); // 委托,声明在类之外
namespace Project21
{
    public class Program
    {
        public static int AddMethod(int num1, int num2)
        {
            Console.WriteLine("Sum={0}", num1 + num2);
            return num1 + num2;
        }
        public static int SubMethod(int num1, int num2)
        {
            Console.WriteLine("Sub={0}", num1 - num2);
            return num1 - num2;
        }
        public static void Main(string[] args)
        {
            NumberDelegate nd1 = AddMethod; //单播
            Console.WriteLine("委托一个方法的结果为:{0}", nd1(3, 2));
            NumberDelegate nd2 = SubMethod;
            nd2 = nd1 + nd2;                //多播
            Console.WriteLine("委托两个方法的结果为:{0}", nd2(2, 4));
            Console.ReadKey();
        }
    }
}

【程序分析】本例演示了委托的多播。在代码中,声明了一个委托NumberDelegate,然后在Main方法里面先后注册了AddMethod和SubMethod方法。注册的方法必须与委托的参数以及返回类型相符合,否则将会提示“返回类型错误”,对于这块是直接编译无法通过的。最后在Main方法中,使用“+”运算符来实现添加委托。

Sum=5
委托一个方法的结果为:5
Sum=6
Sub=-2
委托两个方法的结果为:-2

事件

事件(Event)是C#中的一个高级概念,使用方法与委托相关。读者可以将事件编程分成两个部分来理解,分别为事件发生的类和事件接收处理的类。

  1. 通过事件使用委托事件发生的类,就是说在这个类中触发了一个事件,但该类并不知道是哪一个对象或方法将会接收到并处理它触发的事件。所需要的是在发送方和接收方之间存在一个媒介。这个媒介在.NET Framework中就是委托(Delegate)。在事件接收处理的类中,用户需要有一个处理事件的方法。一般事件发生的类被称为发布器类,而接受并处理该事件的类,被称为订阅器类。发布器(Publisher)是一个包含事件和委托定义的对象。事件和委托之间的联系也定义在这个对象中。发布器类的对象调用这个事件,并通知其他的对象。订阅器(Subscriber)是一个接受事件并提供事件处理程序的对象。在发布器类中的委托调用订阅器类中的方法(事件处理程序)。
    例如在奥运会上,参加百米的田径运动员听到枪声,比赛立即进行。其中,枪声是事件,而运动员比赛就是这个事件发生后的动作。不参加该项比赛的人对枪声没有反应。从程序员的角度分析,当裁判员枪声响起,发生了一个事件,裁判员通知该事件发生,参加比赛的运动员仔细听枪声是否发生。运动员是该事件的订阅者,没有参赛的人不会注意,即没有订阅该事件。
  2. C#中使用事件的步骤
    (1)创建一个委托;
    (2)将创建的委托与特定事件关联(.NET类库中的很多事件都是已经定制好的,所以它们也就有相应的一个委托,在编写关联C#事件处理程序——也就是当有事件发生时要执行方法的时候需要和这个委托有相同的签名);(3)编写C#事件处理程序;
    (4)利用编写的C#事件处理程序生成一个委托实例;(5)把这个委托实例添加到产生事件对象的事件列表中去,这个过程又叫订阅事件。
  3. 声明事件声明事件时,发布者首先要定义委托,然后根据委托定义事件。
  4. 订阅事件声明好事件之后,与该事件有关的人就会订阅事件。因此,只有订阅事件的对象才会收到发生事件的通知,没有订阅该事件的对象则不会收到通知。
  5. 一般都是在满足某个条件下引发事件,如裁判员枪声一响,引发运动员奔跑这个事件。在编程中可以用条件语句,也可以使用方法引发事件。
    编写程序,奥运会上有一场短跑比赛,通过编写一个方法来让这场比赛开始。
using System;
namespace Project22
{
    class Judgment
    {
        //定义一个委托
        public delegate void DelegateRun();
        //定义一个事件
        public event DelegateRun EventRun;
        //引发事件的方法
        public void Begin()
        {
            EventRun();//被引发的事件
        }
    }
    class RunSports
    {
        //定义事件处理方法
        public void Run()
        {
            Console.WriteLine("运动员开始比赛");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            RunSports rs = new RunSports();     //实例化事件发布者
            Judgment judgment = new Judgment();//实例化事件订阅者
            //订阅事件
            judgment.EventRun += new Judgment.DelegateRun(rs.Run);
            //引发事件
            judgment.Begin();
            Console.ReadKey();
        }
    }
}

【程序分析】本例演示了事件的发生。在这段代码中,定义了Judgement类,在该类中定义了一个事件EventRun和引发该事件的方法Begin;还定义了RunSports类,在该类中定义了处理EventRun事件的方法Run。最后在Main方法中,通过Begin方法引发事件EventRun。引发事件的语法与调用方法的语法相同,引发该事件时,将会调用订阅事件的对象的所有委托。

运动员开始比赛
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值