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

下载本文档

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

文档简介

教育部普通高等教育十二五国家级规划教材

《C#程序设计及应用教程》第3版

(包括简化版:《C#程序设计教程》第3版)

第4章接口委托与事件2Ch4接口委托与事件4.1接口4.2委托4.3事件4.4序列化与反序列化4.5反射34.1接口接口的用途表示的仅是调用者和设计者的一种约定;接口的作用和抽象类的作用相似,接口是完全抽象的成员集合。抽象类主要用于关系密切的对象,而接口最适合为不相关的类提供通用的功能。接口和抽象类选择因素抽象类:创建不同版本的组件或实现通用的功能,设计大的功能单元接口:i.创建的功能在大范围的完全不同的对象之间使用ii.设计小而简练的功能块包含所提供的方法名、参数列表等信息,但无具体实现设计接口的最终目的是实现不同模块之间的解耦要通过累积项目经验来体会抽象类和接口的不同设计初衷和好处!4.1.1接口的声明和实现接口可以包含方法、属性、事件和索引器。接口只包含成员的声明部分,而没有实现部分。interface关键字声明一个接口,接口名称一般用大写的“I”开头。[访问修饰符]interface接口名称{

接口体}【例4-1】演示接口的声明与实现。4请看教材P99页中间的例4-14.1.2显式方式实现接口显式实现接口解决多义性的问题:由于不同接口中的成员可重名,一个类中实现接口中的成员时可能会存在多义性的问题,为了解决此问题,可以显式实现接口中的成员,即用完全限定的接口成员名称作为标识符。例如,一个实现“文件抽象”的类一般会实现一个具有释放文件资源作用的Close成员函数,同时还可能使用显式接口成员实现来实现IDisposable接口的Dispose方法(即:可能还存在其他接口,其所包含的方法名与Dispose方法重名):54.1.2显式方式实现接口interfaceIDisposable{voidDispose();}classMyFile:IDisposable{voidIDisposable.Dispose()

{Close();

}publicvoidClose()

{//Dowhat'snecessarytoclosethefileSystem.GC.SuppressFinalize(this);

}}6显式实现接口IDisposable中的Dispose方法,即用完全限定的接口成员名称作为标识符4.1.2显式方式实现接口显式接口成员主要用途:显式接口成员实现在一个公用的类或结构中实现一些仅供内部使用,不允许外界访问的接口。(显式接口成员的实现的成员只能通过接口实例来访问)显式接口成员实现可以消除因同时含有多个相同签名的接口成员所引起的多义性。【例4-2】演示如何以显式方式实现接口。7请再看教材P100页下方的例4-24.1.3利用接口实现多继承C#继承的方式:类继承:实现单一继承接口继承:实现多重继承。接口可以继承其他接口,语法为[访问修饰符]interface接口名称

:被继承的接口列表{

接口体}【例4-3】演示如何利用接口实现多继承。8请看教材P101页的例4-14.2委托委托类型(delegatetype)委托类似C++语言中指向函数的指针函数指针只能够指向静态的方法,委托还可指向实例的方法。委托是完全面向对象的技术,无内存泄露情况。委托特点任何类或对象中的方法都可以通过委托来调用要求方法的参数类型和返回类型要与委托的参数类型和返回类型完全匹配。94.2.1定义委托类型定义委托的一般语法[访问修饰符]delegate返回类型

委托名([参数序列]);例如:定义了一个名为MyFunction的委托publicdelegatedoubleMyFunction(doublex);编译器编译这行代码时,会自动为其生成一个继承自System.Delegate的类型,类型的名称为MyFunction。104.2.2通过委托调用方法定义了委托类型后,就可以像使用其他类型一样使用委托。通过委托,可将方法作为实体赋值给变量,也可以将方法作为委托的参数来传递。例:将f作为参数,f为自定义的委托类型MyFunction:publicstaticdouble[]Apply(double[]a,MyFunctionf){double[]result=newdouble[a.Length];for(inti=0;i<a.Length;i++)result[i]=f(a[i]);returnresult;}114.2.2通过委托调用方法对下面的静态方法:publicstaticdoubleSquare(doublex){returnx*x;}

可将静态的Square方法作为MyFunction类型的参数传递给Apply方法:double[]a={0.0,0.5,1.0};double[]squares=Apply(a,Square);【例4-4】演示委托的基本用法。124.3事件事件(event)是一种使类或对象能够提供通知的成员,事件是利用委托来实现的。一般利用事件响应用户的鼠标或键盘操作,或者自动执行某个与事件关联的行为。要在应用程序中使用事件,必须提供一个事件处理程序(事件处理方法),以便与事件关联的委托能自动调用它。134.3.1事件的声明和引发由于事件是利用委托来实现的,因此声明事件前,需要先定义一个委托。例:publicdelegatevoidMyEventHandler()定义委托后,就可以用event关键字声明事件,例如:publicevent

MyEventHandlerHandler;若要引发该事件,可以定义引发该事件时要调用的方法,如:publicvoidOnHandler(){Handler();}144.3.1事件的声明和引发程序中可以通过“+

=

”和“−

=

”运算符向事件添加委托来注册或取消对应的事件。例如:myEvent.Handler+=newMyEventHandler(myEvent.MyMethod);myEvent.Handler−=newMyEventHandler(myEvent.MyMethod);【例4-5】演示事件的基本用法。15myEvent为包含事件成员Handler的类4.3.2具有标准签名的事件(了解自学)标准签名的事件中,事件处理程序包含两个参数:第1个参数是Object类型,表示引发事件的对象;第2个参数是从EventArgs类型派生的类型,用于保存事件数据标准签名的事件的用法,.NET框架提供了以下委托:EventHandler委托,用于不包含事件数据的事件publicdelegatevoidEventHandler(objectsender,EventArgse)EventHandler<TEventArgs>委托,用于包含事件数据的事件publicdelegatevoidEventHandler<TEventArgs>(Objectsender,TEventArgse)16【例4-6】演示具有标准签名的事件的基本用法。174.4序列化与反序列化序列化:将对象状态转换为可保持或传输的格式的过程;序列化将对象的公共字段和私有字段以及类的名称(包括包含该类的程序集)转换为字节流,然后写入数据流。反序列化:将序列化后的内容再转换为对象;序列化结果和直接创建该对象的效果相同。两个过程结合可以存储和传输数据。184.4.1序列化序列化功能:将对象的状态保持在存储媒体中,以便在以后可以重新创建精确的副本;通过值将对象从一个应用程序域发送到另一个应用程序域中。例如序列化可用于在ASP.NET中保存会话状态并将对象复制到Windows窗体的剪贴板中。远程处理还可以使用序列化通过值将对象从一个应用程序域传递到另一个应用程序域中。194.4.1序列化序列化方法[Serializable]publicclassAuthUserEntry{privatestringaccountName;privateintaccountId;publicstringAccountName{…}publicintAccountId{…}}创建流的实例和使用的格式接口后,对该格式接口调用Serialize方法,类中的所有成员变量都将被序列化,即使是那些已被标记为私有的变量。204.4.1序列化将实例序列化到一个二进制文件中,例:AuthUserEntryuser=newAuthUserEntry(

);user.AccountId=9912053;user.AccountName="张三";IFormatterformater=newBinaryFormatter();Streamstream=newFileStream("UserInfo.bin",FileMode.Create,FileAccess.Write,FileShare.None);formater.Serialize(stream,user);stream.Close();214.4.2反序列化反序列化方法创建用于读取的流和格式化接口用格式化接口反序列化该对象。例:IFormatterformatter=newBinaryFormatter();Streamstream=newFileStream("UserInfo.bin",FileMode.Open,FileAccess.Read,FileShare.Read);AuthUserEntryme=(AuthUserEntry)formatter.Deserialize(stream);stream.Close();注意:序列化一个对象时,并不调用其构造函数。22【例4-7】演示二进制序列化和反序列化的基本用法。234.5反射反射的用途在程序或装配件中查找有关类型的信息从装配件中读取元数据1.Type类(System命名空间)Type类提供的大多数方法都用于获取对应数据类型的成员信息,如构造函数、属性、方法、事件等获取指向给定类型的Type对象方式:(1)使用C#提供的typeof关键字获取指定类型的Type对象,如:Typet=typeof(double);(2)调用Type类的GetType静态方法,例如:Typet=Type.GetType("System.Double")。244.5反射利用GetMethods方法获取int类型提供的所有公共方法名:Typet=typeof(int);System.Reflection.MethodInfo[]Methods=t.GetMethods();foreach(varmethodinMethods){Console.WriteLine(method.Name);}254.5反射2.Assembly类(System.Reflection命名空间)Assembly类允许程序员访问给定装配件的元数据,并包含可以执行一个装配件(假定该装配件是可执行的)的方法。元数据是一种二进制信息,用以对存储在公共语言运行库中可移植的可执行文件或存储在内存中的程序进行描述。26本章习题1、2通过运行和调试教材P109页的例4-7,熟悉序列化与反序列化的使用方法。注:可以不用添加图形界面。了解C#中的Type类所提供的反射机制。自学并自主选择一种数据类型,通过使用Typ

温馨提示

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

评论

0/150

提交评论