第4章接口委托与事件_第1页
第4章接口委托与事件_第2页
第4章接口委托与事件_第3页
第4章接口委托与事件_第4页
第4章接口委托与事件_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、教育部普通高等教育十二五国家级规划教材教育部普通高等教育十二五国家级规划教材C#程序设计及应用教程程序设计及应用教程第第3版版(包括简化版:(包括简化版:C#程序设计教程程序设计教程第第3版)版)第第4章接口委托与事件章接口委托与事件2Ch4 接口委托与事件接口委托与事件4.1 接口接口4.2 委托委托4.3 事件事件4.4 序列化与反序列化序列化与反序列化4.5 反射反射34.1 接口接口l接口的用途接口的用途是用它表示调用者和设计者的一种约定是用它表示调用者和设计者的一种约定;接口的作用和抽象类的作用相似,接口是完全抽象的成员集合接口的作用和抽象类的作用相似,接口是完全抽象的成员集合。抽象

2、类主要用于关系密切的对象,而接口最适合为不相关的类提抽象类主要用于关系密切的对象,而接口最适合为不相关的类提供通用的功能供通用的功能。l接口接口和和抽象类抽象类选择因素选择因素抽象类抽象类:创建不同版本的组件或实现通用的功能创建不同版本的组件或实现通用的功能,设计,设计大的功能大的功能单元单元接口接口:创建的功能在大范围的完全不同的对象之间使用创建的功能在大范围的完全不同的对象之间使用,设计小设计小而简练的功能块而简练的功能块4.1.1 接口的声明和实现接口的声明和实现l接口可以包含方法、属性、事件和索引器。接口可以包含方法、属性、事件和索引器。l接口只包含成员的声明部分,而没有实现部分。接口

3、只包含成员的声明部分,而没有实现部分。linterface关键字声明一个接口关键字声明一个接口,接口名称一般用大写的接口名称一般用大写的“I”开开头。头。 访问修饰符访问修饰符 interface interface 接口名称接口名称 接口体接口体 【例【例4-1】演示接口的声明与实现。】演示接口的声明与实现。44.1.2 显式方式实现接口显式方式实现接口l显式实现接口显式实现接口解决解决多义性的问题多义性的问题:由于不同接口中的成员可重名,一个类中实现接口中的成员时可由于不同接口中的成员可重名,一个类中实现接口中的成员时可能会存在多义性的问题,为了解决此问题,可以显式实现接口中能会存在多义性

4、的问题,为了解决此问题,可以显式实现接口中的成员,即用完全限定的接口成员名称作为标识符。的成员,即用完全限定的接口成员名称作为标识符。例如,一个实现例如,一个实现“文件抽象文件抽象”的类一般会实现一个具有释放文件的类一般会实现一个具有释放文件资源作用的资源作用的Close成员函数,同时还可能使用显式接口成员实现成员函数,同时还可能使用显式接口成员实现来实现来实现IDisposable接口的接口的Dispose方法:方法:54.1.2 显式方式实现接口显式方式实现接口interface IDisposable void Dispose();class MyFile: IDisposable vo

5、id IDisposable.Dispose() Close(); public void Close() /* Do whats necessary to close the file*/ System.GC.SuppressFinalize(this); 64.1.2 显式方式实现接口显式方式实现接口l显式接口成员主要用途:显式接口成员主要用途:显式接口成员实现在一个公用的类或结构中实现一些仅供内显式接口成员实现在一个公用的类或结构中实现一些仅供内部使用部使用,不允许外界访问的接口。不允许外界访问的接口。显式接口成员实现可以消除因同时含有多个相同签名的接口显式接口成员实现可以消除因同时含有

6、多个相同签名的接口成员所引起的多义性。成员所引起的多义性。l【例【例4-2】演示如何以显式方式实现接口】演示如何以显式方式实现接口。74.1.3 利用接口实现多继承利用接口实现多继承lC#继承的方式:继承的方式:类继承类继承:实现单一继承实现单一继承接口继承接口继承:实现多重继承。实现多重继承。l接口可以继承其他接口,语法为接口可以继承其他接口,语法为访问修饰符访问修饰符 interface 接口名称接口名称 : 被继承的接口列表被继承的接口列表 接口体接口体【例【例4-3】演示如何利用接口实现多继承】演示如何利用接口实现多继承。84.2 委委 托托l委托类型(委托类型(delegate ty

7、pe)委托类似委托类似C+语言中指向函数的指针语言中指向函数的指针函数指针只能够指向静态的方法函数指针只能够指向静态的方法,委托还可指向实例的方法。委托还可指向实例的方法。委托是完全面向对象的技术,委托是完全面向对象的技术,无无内存泄露情况。内存泄露情况。l委托特点委托特点任何类或对象中的方法都可以通过委托来调用任何类或对象中的方法都可以通过委托来调用要求方法的参数类型和返回类型要求方法的参数类型和返回类型要要与委托的参数类型和返回类型与委托的参数类型和返回类型完全匹配。完全匹配。94.2.1 定义委托类型定义委托类型l定义委托的一般语法定义委托的一般语法访问修饰符访问修饰符 delegate

8、 返回类型返回类型 委托名委托名(参数序列参数序列);例如:定义了一个名为例如:定义了一个名为MyFunction的委托的委托public delegate double MyFunction(double x);l编译器编译这行代码时,会自动为其生成一个继承自编译器编译这行代码时,会自动为其生成一个继承自System.Delegate的类型,类型的名称为的类型,类型的名称为MyFunction。104.2.2 通过委托调用方法通过委托调用方法l定义了委托类型后,就可以像使用其他类型一样使用委托。通定义了委托类型后,就可以像使用其他类型一样使用委托。通过委托,可将方法作为实体赋值给变量,也可以

9、将方法作为委过委托,可将方法作为实体赋值给变量,也可以将方法作为委托的参数来传递。托的参数来传递。l例:例:将将f作为参数,作为参数,f为自定义的委托类型为自定义的委托类型MyFunction:public static double Apply(double a, MyFunction f) double result = new doublea.Length; for (int i = 0; i a.Length; i+) resulti = f(ai); return result;114.2.2 通过委托调用方法通过委托调用方法l对对下面的静态方法:下面的静态方法:public sta

10、tic double Square(double x) return x * x; 可将静态的可将静态的Square方法作为方法作为MyFunction类型的参数传递给类型的参数传递给Apply方法:方法:double a = 0.0, 0.5, 1.0;double squares = Apply(a, Square);【例【例4-4】演示委托的基本用法】演示委托的基本用法。124.3 事事 件件l事件(事件(event)是一种使类或对象能够提供通知的成员,事件是利用委托来实现是一种使类或对象能够提供通知的成员,事件是利用委托来实现的。的。一般利用事件响应用户的鼠标或键盘操作,或者自动执行某

11、个与一般利用事件响应用户的鼠标或键盘操作,或者自动执行某个与事件关联的行为。事件关联的行为。要在应用程序中使用事件,必须提供一个事件处理程序(事件处要在应用程序中使用事件,必须提供一个事件处理程序(事件处理方法),以便与事件关联的委托能自动调用它。理方法),以便与事件关联的委托能自动调用它。134.3.1 事件的声明和引发事件的声明和引发l由于事件是利用委托来实现的,因此声明事件前,需要先定义由于事件是利用委托来实现的,因此声明事件前,需要先定义一个委托。例:一个委托。例:public delegate void MyEventHandler()l定义委托后,就可以用定义委托后,就可以用eve

12、nt关键字声明事件,例如:关键字声明事件,例如:public event MyEventHandler Handler;l若要引发该事件,可以定义引发该事件时要调用的方法,如:若要引发该事件,可以定义引发该事件时要调用的方法,如:public void OnHandler() Handler();144.3.1 事件的声明和引发事件的声明和引发l程序中可以通过程序中可以通过“+ = ”和和“ = ”运算符向事件添加委托来运算符向事件添加委托来注册或取消对应的事件。例如:注册或取消对应的事件。例如:myEvent.Handler += new MyEventHandler(myEvent.MyM

13、ethod); myEvent.Handler = new MyEventHandler(myEvent.MyMethod);【例【例4-5】演示事件的基本用法】演示事件的基本用法。154.3.2 具有标准签名的事件具有标准签名的事件l标准签名的事件中,事件处理程序包含两个参数标准签名的事件中,事件处理程序包含两个参数:第第1个参数是个参数是Object类型,表示引发事件的对象;类型,表示引发事件的对象;第第2个参数是从个参数是从EventArgs类型派生的类型,用于保存事件数据类型派生的类型,用于保存事件数据l标准签名的事件的用法,标准签名的事件的用法,.NET框架提供了以下委托:框架提供了

14、以下委托:EventHandler委托委托,用于不包含事件数据的事件用于不包含事件数据的事件public delegate void EventHandler(object sender, EventArgs public delegate void EventHandler(object sender, EventArgs e)e)EventHandler委托委托,用于包含事件数据的事件用于包含事件数据的事件public delegate void EventHandler(Object sender, public delegate void EventHandler(Object sen

15、der, TEventArgs e)TEventArgs e)16【例【例4-6】演示具有标准签名的事件的基本用法】演示具有标准签名的事件的基本用法。174.4 序列化与反序列化序列化与反序列化l序列化序列化:将对象状态转换为可保持或传输的格式的过程将对象状态转换为可保持或传输的格式的过程;序列化序列化将将对象的公共字段和私有字段以及类的名称(包括包含该对象的公共字段和私有字段以及类的名称(包括包含该类的程序集)转换为字节流,然后写入数据流。类的程序集)转换为字节流,然后写入数据流。l反序列化反序列化:将序列化后的内容再转换为对象将序列化后的内容再转换为对象;序列化结果和直接创建该对象的效果相

16、同。序列化结果和直接创建该对象的效果相同。l两个过程结合可以存储和传输数据。两个过程结合可以存储和传输数据。184.4.1 序列化序列化l序列化功能:序列化功能:将对象的状态保持在存储媒体中,以便在以后可以重新创建精确将对象的状态保持在存储媒体中,以便在以后可以重新创建精确的副本;的副本;通过值将对象从一个应用程序域发送到另一个应用程序域中。通过值将对象从一个应用程序域发送到另一个应用程序域中。l例如例如序列化可用于在序列化可用于在ASP.NET中保存会话状态并将对象复制到中保存会话状态并将对象复制到Windows窗体的剪贴板中。窗体的剪贴板中。远程处理还可以使用序列化通过值将对象从一个应用程

17、序域传递远程处理还可以使用序列化通过值将对象从一个应用程序域传递到另一个应用程序域中。到另一个应用程序域中。194.4.1 序列化序列化l序列化序列化方法方法Serializablepublic class AuthUserEntry private string accountName; private int accountId; public string AccountName public int AccountId l创建流的实例和使用的创建流的实例和使用的格式接口后,对该格式接格式接口后,对该格式接口调用口调用Serialize方法,方法,类中的所有成员变量都将类中的所有成员变量

18、都将被序列化,即使是那些已被序列化,即使是那些已被标记为私有的变量。被标记为私有的变量。204.4.1 序列化序列化l将将实例序列化到一个二进制文件中实例序列化到一个二进制文件中,例:,例:AuthUserEntry user = new AuthUserEntry( );user.AccountId = 9912053;user.AccountName = 张三张三;IFormatter formater = new BinaryFormatter( );Stream stream = new FileStream(UserInfo.bin, FileMode.Create, FileAcc

19、ess.Write, FileShare.None);formater.Serialize(stream, user);stream.Close( );214.4.2 反序列化反序列化l反序列化反序列化方法方法创建用于读取的流和格式化接口创建用于读取的流和格式化接口用格式化接口反序列化该对象。用格式化接口反序列化该对象。l例:例:IFormatter formatter = new BinaryFormatter( );Stream stream = new FileStream(UserInfo.bin, FileMode.Open, FileAccess.Read, FileShare.R

20、ead);AuthUserEntry me = (AuthUserEntry) formatter.Deserialize(stream);stream.Close( );l注意注意:序列化一个对象时,并不调用其构造函数。序列化一个对象时,并不调用其构造函数。22【例【例4-7】演示二进制序列化和反序列化的基本用法】演示二进制序列化和反序列化的基本用法。234.5 反反 射射l反射的用途反射的用途在程序或装配件中查找有关类型的信息在程序或装配件中查找有关类型的信息从装配件中读取元数据从装配件中读取元数据l1Type类类( System命名空间命名空间)Type类提供的大多数方法都用于获取对应数

21、据类型的成员信息,类提供的大多数方法都用于获取对应数据类型的成员信息,如构造函数、属性、方法、事件等如构造函数、属性、方法、事件等获取指向给定类型的获取指向给定类型的Type对象方式对象方式:(1 1)使用)使用C#C#提供的提供的typeoftypeof关键字获取指定类型的关键字获取指定类型的TypeType对象,如:对象,如:Type t = typeof(double);(2 2)调用)调用TypeType类的类的GetTypeGetType静态方法,例如:静态方法,例如:Type t = Type.GetType(System.Double)。244.5 反反 射射l利用利用GetMethods方法获取方法获取int类型提供的所有公共方法名:类型提供的所有公共方法名:Type t = typeof(int);System.Reflection.MethodInfo Methods = t.GetMethods();foreach (var method in Meth

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论