第8章 面向对象的高级程序设计.ppt

  1. 1、本文档共75页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第8章 面向对象的高级程序设计

8.5 委托 8.5.4 委托中的协变与逆变 1. 协变 public Person getPerson(int i){ …… } public Student getStudent(int i){ …… } 现在有一个委托PointPerson,声明格式如下: public delegate Person PointPerson(int i); 显然,委托PointPerson的签名与方法getPerson的签名匹配,可以直接通过该委托对象来调用方法getPerson,而方法getStudent的返回值类型是委托PointPerson返回值类型的派生类,因此方法getStudent是协变委托方法。如果通过委托对象来调用方法getStudent,则系统将进行隐式转换,把getStudent的返回值类型Student转换为Person(再返回)。 8.5 委托 8.5.4 委托中的协变与逆变 2. 逆变 逆变允许将带有派生参数的方法用作委托,当委托方法签名具有一个或多个参数,并且这些参数的类型派生自方法参数时,就称为逆变委托方法。 因为委托方法签名参数比方法参数更具体,所以可以在传递给处理程序方法时对它们进行隐式转换。逆变使得可由大量类使用的更通用的委托方法的创建变得更加简单。 例如,在上面协变例子中的集合类Persons和Students都还具有一个返回某个元素位置的方法,其声明格式如下: 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) 侦听器:事件激发的时候,Windows内置的侦听器把事件消息发送给订阅者。 8.6 事件 8.6.1 事件简介 基于“发布者/订阅者(publish / subscriber)”模式的具体实现步骤如下: (1) 定义委托类型,并在发布者类中定义一个该类型的公有事件成员。 (2) 在订阅者类中定义委托处理方法。 (3) 订阅者对象将其事件处理方法合并到发布者对象的事件成员上。 (4) 发布者对象在特定的情况下激发事件,自动调用订阅者对象的委托处理方法。 8.6 事件 8.6.2 声明事件和激发事件 在C#中,事件实际上是委托类型的变量,是委托的一种特殊形式。C#允许使用内置的委托类型来声明一个标准的事件,也允许先自定义委托,再声明自定义事件。 在.NET Framework中内置的Eve

文档评论(0)

dajuhyy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档