第8 面向对象课件.pptVIP

  • 2
  • 0
  • 约1.79万字
  • 约 72页
  • 2018-06-26 发布于福建
  • 举报
第8 面向对象课件

8.5 委托 8.5.4 委托中的协变与逆变 2. 逆变 public int getPosition(Person p){ …… } public int getPosition(Student s){ …… } 现在有一个委托Position,声明格式如下: public delegate int Position(Student s); 显然委托Position的签名与第二个getPosition方法签名相同,而委托Position的参数数据类型正好是第一个getPosition方法的参数数据类型的派生类,因此如果使用该委托来调用第一个getPosition方法,则系统将进行隐式转换,把委托的Student类型转换为Person类型。 综上所述,协变是指能够使用与原始指定的派生类型相比,派生程度更大的类型;逆变则是指能够使用派生程度更小的类型。 8.6 事件 事件(event)是面向对象程序设计的重要特征之一,是类的重要成员,其使用方法和委托的联系非常密切。 8.6.1 事件简介 事件是类用来通知对象需要执行某种操作的方式,通常用在图形用户界面中。在Windows应用程序运行时,经常会产生许多事件,例如:鼠标单击按钮、按下按键、窗口最小化或者最大化等。 8.6 事件 8.6.1 事件简介 事件定义为对象发送的消息,以发消息的形式通知操作的发生。事件本质上就是对消息的封装,用作对象之间的通信。 面向对象程序设计是基于事件驱动的程序设计,一个完整的事件处理系统一般有三个构成要素: (1) 事件源:指能触发事件的对象,也称为事件的发送者或事件的发布者。 (2) 侦听器:指能接收到事件消息的对象,Windows提供了基础的事件侦听服务。 (3) 事件处理程序:当事件发生时,可以对事件进行处理,也称为事件函数或事件方法; 8.6 事件 8.6.1 事件简介 要想正确的处理.NET中的事件,关键是要理解事件和委托是如何工作的。基于“发布者/订阅者(publish / subscriber)”模式的具体实现步骤如下: (1) 定义委托类型,并在发布者类中定义一个该类型的公有事件成员。 (2) 在订阅者类中定义委托处理方法。 (3) 订阅者对象将其事件处理方法合并到发布者对象的事件成员上。 (4) 发布者对象在特定的情况下激发事件,自动调用订阅者对象的委托处理方法。 8.6 事件 8.6.2 声明事件和激发事件 在C#中,事件实际上是委托类型的变量,是委托的一种特殊形式。C#允许使用内置的委托类型来声明一个标准的事件,也允许先自定义委托,再声明自定义事件。 在.NET Framework中内置的EventHandler委托具有两个参数,它们的数据类型分别是Object和EventArgs类型,并且没有返回值。Object类型的参数名通常为sender,表示事件发布者本身;EventArgs类型的参数名通常为e,它将System.EventArgs类的新实例传递给事件处理方法,主要包括与事件相关的数据。 在实际编程中,有时需要从EventArgs类派生自定义事件参数类,这样发布者可以将特定的数据发送给接收者的事件处理方法。 8.6 事件 8.6.2 声明事件和激发事件 使用内置的EventHandler委托声明事件的一般格式如下: 【格式】public event EventHandler 事件名; 【说明】event关键字用于在发布者类中声明事件。 例如,以下代码表示定义了一个名为onClick的事件。 public event EventHandler onClick; 8.6 事件 8.6.2 声明事件和激发事件 使用自定义的委托类型也可以声明事件,一般格式如下: public delegate 返回值类型 委托类型名([参数列表]); public event 委托类型名 事件名; 【说明】委托类型的参数非常灵活,可以省略,可以是标准的Object参数和EventArgs参数,也可以是其他参数,但一定要注意保证与事件处理程序的参数匹配。 8.6 事件 8.6.3 订阅事件和处理事件 事件声明之后,实质上得到的只是一个委托型的变量,并不意味着就能够成功触发事件。如何将声明的事件和事件处理程序联系起来呢?这就要用到订阅者(负责绑定事件与事件方法的类)。 也就是需要在接收事件的类中创建一个方法来响应这个事件(即处理事件),并且创建委托对象把事件与事件方法联系起来,这个操作过程称为“订阅事件”。 【例8-9】 应用事件驱动模型解决交通红绿灯问题。 8.6 事件

文档评论(0)

1亿VIP精品文档

相关文档