资源预览内容
第1页 / 共233页
第2页 / 共233页
第3页 / 共233页
第4页 / 共233页
第5页 / 共233页
第6页 / 共233页
第7页 / 共233页
第8页 / 共233页
第9页 / 共233页
第10页 / 共233页
亲,该文档总共233页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
C#编程及应用程序开发教程三第10章 接口、代理和事件 (时间:3次课,6学时)第10章 接口、代理和事件 n前面已经介绍了有关面向对象程序设计的基本实现技能,本章将介绍一 些面向对象程序设计的高级技术:接口、代理和事件。接口和代理都属 于C#语言的引用数据类型,而事件是C#语言新增加的一个成员。由于 事件和代理有很密切的关系,所以把事件也放在本章介绍。n本章教学目的:n了解接口和类的区别n掌握接口的定义,实现和使用n掌握创建和使用代理的方法n掌握Delegate类和MulticastDelegate类实现多重代理的方法n掌握创建和使用事件的方法第10章 接口、代理和事件n10.1 接 口n10.2 代 理 n10.3 事 件 10.1 接 口u 10.1.1 接口与类 u 10.1.2 接口的定义 u 10.1.3 接口的实现与使用 u 10.1.4 接口映射 u 10.1.5 显式接口成员实现 u 10.1.6 接口实现的继承 u 10.1.7 接口的重新实现 u 10.1.8 接口的查询 10.1 接 口 n第9章中提到,C#只允许单继承机制。而如果我们希望一个子类继承两 个或两个以上更多的父类时,C#语言是不支持的,即C#不允许利用类 进行多重继承。但在C#语言中,“多重继承”的功能是通过“接口 (Interface)”技术来模拟实现的。10.1.1 接口与类 n在C#中需要实现多重继承时,就要使用接口技术。接口具有类似于抽象 类的地位,它只具有“被继承”特性,所以接口也像抽象类一样,是一个 最高层次的“基类”。但抽象类只能实现单继承,而接口可实现多继承。 因此,在C#中,接口和抽象类既有相同的继承特性(最高层“基类”),又 有不同的实现机制。n抽象类指的是至少包含一个抽象方法的类,而抽象方法指的是被继承时 ,必须被重写的方法。而接口是另一种类似于抽象类的引用类型,它主 要用来声明要定义的类中将包含哪些功能(方法、属性、索引或事件), 但不包含这些功能的实例化代码(同抽象类),只在“继承”(通常,在接口 技术中称为“实现”,以便与类中的“继承”有所区别)时才实例化这些功能 的代码(也同抽象类)。换句话说,接口只是定义了类必须做什么,而不 是怎样做。n一旦定义了一个接口,许多类都可以实现它。所谓“实现接口”就是意味 着某个将要使用这个接口的类,必须为该接口所定义的方法、属性、索 引或事件提供实体(实现的代码)。 10.1.1 接口与类 n所以说接口类似于抽象类,但它与类之间有以下区别:l接口只提供类所需实现的方法、属性、索引或事件的格式或约定,不提 供任何相应的功能代码。具体的功能代码由继承(使用)该接口的类或结 构来实现,这叫作“接口实现”。l接口中只包含方法、属性、索引或事件,而不包含任何数据成员、构造 函数、析构函数和静态函数,而且接口中的所有成员都被视为公有,不 能有任何访问修饰符。l要实现接口的类必须实现接口中的所有成员,即当一个接口或类从其他 接口继承时,它将继承它的基接口中的所有成员。而抽象类则可以根据 需要重载部分或全部抽象成员。l接口允许多重继承。一个接口可从多个基接口继承,并包含这些基接口 继承树上的所有基接口;一个类可以从多个基接口继承;但一个类最多 只能有一个直接父类。10.1.1 接口与类 n在实际应用中是使用接口还是抽象类为组件提供多态性,一般从以下几 点考虑:n如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单易行 的方法来控制组件版本。通过更新基类,所有继承类都随更改自动更新 。另一方面,接口一旦创建就不能更改。如果需要接口的新版本,必须 创建一个全新的接口。 n如果创建的功能将在大范围的全异对象间使用,则使用接口。抽象类应 主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。 n如果要设计小而简练的功能块,则使用接口。如果要设计大的功能单元 ,则使用抽象类。 n如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。抽 象类允许部分实现类,而接口不包含任何成员的实现。 10.1.2 接口的定义 n1. 接口定义n接口定义的语句格式为:n代码属性 修饰符 interface 接口名:基接口列表nn /接口成员定义体n10.1.2 接口的定义 n2. 接口成员声明n接口成员包括从基接口继承的成员以及接口自身定义的成员。接口成员 可以是方法、属性、索引和事件,但不能有常数、运算符、构造函数、 析构函数、类型和静态成员。因为接口只具有“被继承”的特性,所以默 认时,所有接口成员只具有public特性,接口成员的声明中不能含有任 何其他修饰符。 10.1.2 接口的定义 n(1)接口的方法成员声明格式如下:n代码属性 new 返回值类型 方法名(参数1,参数2,.);n接口中只能提供方法的格式声明,而不能包含方法的实现,所以接口方法的声明 总是以分号结束。n用户可以使用new修饰符在派生的接口中隐藏基接口的同名方法成员,其作用 与类中new修饰符的作用相同。例如:ninterface IAnnvoid Math();nninterface IB: IA /接口IB继承接口IAnnnew void Math(); /如果不加new修饰符,将会有警告。加上new就可消 除n10.1.2 接口的定义 n【例10.1】定义一个接口DataSeries,任何类使用该接口可以产生一 系列数字。npublic interface DataSeriesnnint getNext(); /返回数字系列中的下一个数字nvoid reset(); /重新开始nvoid setStart(int x); /设置初始值n10.1.2 接口的定义 n(2) 接口的属性成员声明格式如下:n代码属性 new 属性类型 属性名get;和/或set;n同理,接口中的属性成员不能包含实现,所以只能以分号结 束。在接口属性成员中同样也可以使用new修饰符来隐藏从 基接口继承的同名属性成员。接口属性成员的访问方式有只 读、只写和可读写3种,如表10.1所示。10.1.2 接口的定义 访问方式描 述get;表示只读属性,即只能读取该属性的值set;表示只写属性,即只能对属性进行赋值get; set;表示可读写属性,即可读取属性的值也可以对它进行赋值表10.1 接口属性的访问方式10.1.2 接口的定义 n【例10.2】重写接口DataSeries,通过类MyThree实现接口,同时使用接口属性来获取数列中的下一个元素。nusing System;npublic interface DataSeries /接口nnint Next /接口的一个属性nnget; /返回数列的下一个数字nset; /设置下一个数字nnnclass MyThree: DataSeries /实现接口DataSeriesnnint x;npublic MyThree()x=0; /构造函数npublic int Next /实现接口属性:获取或设置值nnget x+=3; return x;nset x=value; nnnclass App /应用类n npublic static void Main()nnMyThree ob=new MyThree ();nfor (int i=0; i=0; i-, j+)n temp +=si;ns=temp;nnpublic static void Main()n10.2.5 多重代理的实现 n/创建代理 nStringDelegate strdeligate; /创建一个空值代理 n/创建引用ReplaceSpaces方法的代理 nStringDelegate replacesp=new StringDelegate (ReplaceSpaces); nStringDelegate removesp=new StringDelegate (RemoveSpaces); nStringDelegate reversestr=new StringDelegate (Reverse); nstring str=“I am a teacher.“; n/创建多播,用于调用ReplaceSpaces()和Reverse()方法 nstrdeligate = replacesp; nstrdeligate += reversestr; /用相应的代理建立方法链表(因代理代表着一个方法) n/调用多播 nstrdeligate (ref str); n/调用多播:先调用ReplaceSpaces()方法,再调用Reverse()方法 nConsole.WriteLine(“操作字符串结果:“+str); /显示结果 nConsole.WriteLine(); n/删除ReplaceSpaces方法,加入RemoveSpaces方法 nstrdeligate -= replacesp; /删除ReplaceSpaces方法 nstrdeligate += removesp; /建立另一个多播,加入RemoveSpaces方法 nstr=“I am a teacher.“; /重新设定字符串 n/调用多播 nstrdeligate (ref str); nConsole.WriteLine(“操作字符串结果:“+str); /显示结果 nConsole.WriteLine(); n n10.2.5 多重代理的实现 n运行结果如下:n用连字符替换空格n字符串反序n操作字符串结果: rehcaet-a-ma-I n字符串反序n删除空格n操作字符串结果: rehcaetamaI n创建和使用多播的过程是:先把strdeligate的值置为replacesp的引用,然后 使用+=来添加reversestr引用,则当调用strdeligate时,这两个方法都得到 了调用,先把空格替换为连字符,然后再把字符串变为逆序输出。接着又把 replacesp从方法链表中删除,并把removesp加入链表。这样当再次调用 strdeligate时,执行的是先删除空格,然后再把字符串变为逆序输出。在本例 中使用ref参数将会给调用者返回改变后的字符串。n 从上述程序代码中可见,只用一条语句“strdeligate (ref str);”就执行了多 个方法,即多重代理可以通过一条语句执行多个方法。10.3 事 件 u 10.3.1 事件的概念 u 10.3.2 创建事件和使用事件 u 10.3.3 多播事件 10.3 事 件 10.3.1 事件的概念 n有关“事件(Even)”的概念,对于熟悉Windows用户界面编程的程序员 来说并不陌生。例如,在实际应用中,我们希望在“单击某个按钮”后, 系统能对此“单击”事件作出某种反应,如显示一张图表或播放一段音乐 等,这就是一个典型的事件发生和事件处理过程。我们把“单击”按钮的 动作叫触发事件,显示图表或播放音乐叫处理“单击”事件。n在C#语言中,事件的发生不仅仅由用户的操作驱动,如单击按钮或单击 鼠标或选择菜单等;事件还可以由程序逻辑触发,如类的某个对象的状 态发生的变化,导致程序对这种变化做出某种处理等。触发事件的对象 称为事件发送者(触发事件的对象);接收事件的对象称为事件接收者(处 理事件的方法)。10.3.1 事件的概念 n在C#语言中,事件机制有以下特征:n事件和变量、方法、属性一样,也是类
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号