《接口代理和事》PPT课件.ppt
《《接口代理和事》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《接口代理和事》PPT课件.ppt(115页珍藏版)》请在三一办公上搜索。
1、第10章 接口、代理和事件,(时间:3次课,6学时),第10章 接口、代理和事件,前面已经介绍了有关面向对象程序设计的基本实现技能,本章将介绍一些面向对象程序设计的高级技术:接口、代理和事件。接口和代理都属于C#语言的引用数据类型,而事件是C#语言新增加的一个成员。由于事件和代理有很密切的关系,所以把事件也放在本章介绍。本章教学目的:了解接口和类的区别掌握接口的定义,实现和使用掌握创建和使用代理的方法掌握Delegate类和MulticastDelegate类实现多重代理的方法掌握创建和使用事件的方法,第10章 接口、代理和事件,10.1 接 口10.2 代 理 10.3 事 件,10.1 接
2、 口,10.1.1 接口与类 10.1.2 接口的定义 10.1.3 接口的实现与使用 10.1.4 接口映射 10.1.5 显式接口成员实现 10.1.6 接口实现的继承 10.1.7 接口的重新实现 10.1.8 接口的查询,10.1 接 口,第9章中提到,C#只允许单继承机制。而如果我们希望一个子类继承两个或两个以上更多的父类时,C#语言是不支持的,即C#不允许利用类进行多重继承。但在C#语言中,“多重继承”的功能是通过“接口(Interface)”技术来模拟实现的。,10.1.1 接口与类,在C#中需要实现多重继承时,就要使用接口技术。接口具有类似于抽象类的地位,它只具有“被继承”特性
3、,所以接口也像抽象类一样,是一个最高层次的“基类”。但抽象类只能实现单继承,而接口可实现多继承。因此,在C#中,接口和抽象类既有相同的继承特性(最高层“基类”),又有不同的实现机制。抽象类指的是至少包含一个抽象方法的类,而抽象方法指的是被继承时,必须被重写的方法。而接口是另一种类似于抽象类的引用类型,它主要用来声明要定义的类中将包含哪些功能(方法、属性、索引或事件),但不包含这些功能的实例化代码(同抽象类),只在“继承”(通常,在接口技术中称为“实现”,以便与类中的“继承”有所区别)时才实例化这些功能的代码(也同抽象类)。换句话说,接口只是定义了类必须做什么,而不是怎样做。一旦定义了一个接口,
4、许多类都可以实现它。所谓“实现接口”就是意味着某个将要使用这个接口的类,必须为该接口所定义的方法、属性、索引或事件提供实体(实现的代码)。,10.1.1 接口与类,所以说接口类似于抽象类,但它与类之间有以下区别:接口只提供类所需实现的方法、属性、索引或事件的格式或约定,不提供任何相应的功能代码。具体的功能代码由继承(使用)该接口的类或结构来实现,这叫作“接口实现”。接口中只包含方法、属性、索引或事件,而不包含任何数据成员、构造函数、析构函数和静态函数,而且接口中的所有成员都被视为公有,不能有任何访问修饰符。要实现接口的类必须实现接口中的所有成员,即当一个接口或类从其他接口继承时,它将继承它的基
5、接口中的所有成员。而抽象类则可以根据需要重载部分或全部抽象成员。接口允许多重继承。一个接口可从多个基接口继承,并包含这些基接口继承树上的所有基接口;一个类可以从多个基接口继承;但一个类最多只能有一个直接父类。,10.1.1 接口与类,在实际应用中是使用接口还是抽象类为组件提供多态性,一般从以下几点考虑:如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单易行的方法来控制组件版本。通过更新基类,所有继承类都随更改自动更新。另一方面,接口一旦创建就不能更改。如果需要接口的新版本,必须创建一个全新的接口。如果创建的功能将在大范围的全异对象间使用,则使用接口。抽象类应主要用于关系密切的对象,而接
6、口最适合为不相关的类提供通用功能。如果要设计小而简练的功能块,则使用接口。如果要设计大的功能单元,则使用抽象类。如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。抽象类允许部分实现类,而接口不包含任何成员的实现。,10.1.2 接口的定义,1.接口定义接口定义的语句格式为:代码属性 修饰符 interface 接口名:基接口列表/接口成员定义体,10.1.2 接口的定义,2.接口成员声明接口成员包括从基接口继承的成员以及接口自身定义的成员。接口成员可以是方法、属性、索引和事件,但不能有常数、运算符、构造函数、析构函数、类型和静态成员。因为接口只具有“被继承”的特性,所以默认时,所有接
7、口成员只具有public特性,接口成员的声明中不能含有任何其他修饰符。,10.1.2 接口的定义,(1)接口的方法成员声明格式如下:代码属性 new 返回值类型 方法名(参数1,参数2,.);接口中只能提供方法的格式声明,而不能包含方法的实现,所以接口方法的声明总是以分号结束。用户可以使用new修饰符在派生的接口中隐藏基接口的同名方法成员,其作用与类中new修饰符的作用相同。例如:interface IAvoid Math();interface IB:IA/接口IB继承接口IAnew void Math();/如果不加new修饰符,将会有警告。加上new就可消除,10.1.2 接口的定义,【
8、例10.1】定义一个接口DataSeries,任何类使用该接口可以产生一系列数字。public interface DataSeriesint getNext();/返回数字系列中的下一个数字void reset();/重新开始void setStart(int x);/设置初始值,10.1.2 接口的定义,(2)接口的属性成员声明格式如下:代码属性 new 属性类型 属性名get;和/或set;同理,接口中的属性成员不能包含实现,所以只能以分号结束。在接口属性成员中同样也可以使用new修饰符来隐藏从基接口继承的同名属性成员。接口属性成员的访问方式有只读、只写和可读写3种,如表10.1所示。,
9、10.1.2 接口的定义,表10.1 接口属性的访问方式,10.1.2 接口的定义,【例10.2】重写接口DataSeries,通过类MyThree实现接口,同时使用接口属性来获取数列中的下一个元素。using System;public interface DataSeries/接口int Next/接口的一个属性get;/返回数列的下一个数字set;/设置下一个数字class MyThree:DataSeries/实现接口DataSeriesint x;public MyThree()x=0;/构造函数public int Next/实现接口属性:获取或设置值get x+=3;return
10、 x;set x=value;class App/应用类 public static void Main()MyThree ob=new MyThree();for(int i=0;i3;i+)/通过属性访问接口Console.WriteLine(Next value is+ob.Next);Console.WriteLine(nStarting at 100);ob.Next=100;for(int i=0;i3;i+)/通过属性访问接口Console.WriteLine(Next value is+ob.Next);,10.1.2 接口的定义,程序输出结果如下:Next value is
11、3Next value is 6Next value is 9Starting at 100Next value is 103Next value is 106Next value is 109,10.1.2 接口的定义,(3)接口的索引器成员声明格式如下:代码属性 new 数据类型 this 索引器参数类型 参数名 get;和/或set;此格式中的代码属性和new修饰符的用法和作用,与接口的方法成员和属性成员声明的含义完全一样。声明中的“数据类型”是指索引器引入的元素类型,接口声明中的索引器成员只能用来指定索引器的访问方式,同表10.1。同样不允许在索引器参数上使用out和ref关键字。例如
12、:interface IAname(yang yan)/附加信息(即属性说明)int this int index ger;set;/索引器定义,10.1.2 接口的定义,【例10.3】以下是接口DataSeries的另一个版本,其中添加了返回第i个元素的只读索引。using System;public interface DataSeries/接口int Next get;set;/接口的一个属性int thisint index/接口的一个索引,一个只读索引get;/返回数列中的指定数字class MyThree:DataSeries/实现接口DataSeriesint x;public
13、MyThree()x=0;/构造函数public int Next/接口属性的实现。获取或设置值getx+=3;return x;setx=value;public int thisint index/实现索引getx=0;for(int i=0;iindex;i+)x+=3;return x;,10.1.2 接口的定义,class App/应用类 public static void Main()MyThree ob=new MyThree();for(int i=0;i3;i+)/通过属性访问接口Console.WriteLine(Next value is+ob.Next);Consol
14、e.WriteLine(Starting at 100);ob.Next=100;for(int i=0;i3;i+)/通过属性访问接口Console.WriteLine(Next value is+ob.Next);Console.WriteLine(Resetting to 0);ob.Next=0;for(int i=0;i3;i+)/通过索引访问接口Console.WriteLine(Next value is+ob.Next);,10.1.2 接口的定义,程序输出结果如下:Next value is 3Next value is 6Next value is 9Starting at
15、 100Next value is 103Next value is 106Next value is 109Resetting to 0 Next value is 3Next value is 6Next value is 9,10.1.2 接口的定义,(4)接口的事件成员声明有关“事件”在本章的最后一节介绍,本处只给出接口事件的声明格式:代码属性 new event 事件代理名 事件名;事件声明中的代码属性和new修饰符的用法和作用,与接口的方法成员和属性成员的声明含义完全一样。例如:Interface IA/其他成员的定义event Click MyEvent;,10.1.3 接口的实
16、现与使用,以上我们只是定义了一个接口,而在接口中声明的方法、属性、索引或事件的真正实现是由类来完成的。所以说,一旦定义了接口,一个或更多的类就可以以不同的方式来实现该接口中的功能,并且每个类必须实现该接口中所定义的所有方法、属性、索引或事件。即一个接口可以由多个类来实现,而在一个类中也可以实现一个或多个接口。实现接口的方式与继承相同,即将接口放在类名的后面,中间用冒号隔开。实现接口的语句格式:class 类名:接口名列表/类实体 其中接口名是指该类所要实现的接口的名称。,10.1.3 接口的实现与使用,1.一个类实现(使用)一个接口。【例10.4】创建一个类MyThree,实现【例10.1】中
17、定义的接口DataSeries,用于生成一系列公差为3的数列。using System;public interface DataSeries/接口DataSeriesint getNext();/返回数字系列中的下一个数字void reset();/重新开始void setStart(int x);/设置初始值class MyThree:DataSeries/实现接口DataSeries的类int start;int value;public MyThree()/构造函数start=0;value=0;public int getNext()/实现接口DataSeries中的方法getNex
18、t()value+=3;return value;,10.1.3 接口的实现与使用,public void reset()/实现接口DataSeries中的方法reset()start=0;value=0;public void setStart(int x)/实现接口DataSeries中的方法setStart()start=x;value=x;class AppDataSeries/应用类public static void Main()MyThree ob=new MyThree();for(int i=0;i3;i+)/循环输出3个数字Console.WriteLine(Next va
19、lue is+ob.getNext();Console.WriteLine(Resstting);/重新开始ob.reset();for(int i=0;i3;i+)/循环输出3个数字Console.WriteLine(Next value is+ob.getNext();Console.WriteLine(Starting at 100);/从100重新开始ob.setStart(100);for(int i=0;i3;i+)/循环输出3个数字Console.WriteLine(Next value is+ob.getNext();,10.1.3 接口的实现与使用,程序的运行结果:Next
20、value is 3Next value is 6Next value is 9ResettingNext value is 3Next value is 6Next value is 9Starting at 100Next value is 103Next value is 106Next value is 109可见,要实现接口,必须在类名后包括接口,然后提供接口的每一个成员的实现。注意观察上例中接口成员和类中相应的实现的访问类型的写法,在接口成员的声明中不需要任何访问修饰符,而在类中相应接口成员实现定义中则都用public修饰符。,10.1.3 接口的实现与使用,类除了可以用来实现接口
21、外,还可以定义它自己的额外成员,如我们在MyThree类中再添加一个方法getPrevious(),用于返回前一个数字的值。class MyThree:DataSeries/实现接口DataSeries,并添加getPrevious()方法int start;int value;int prev;public MyThree()/构造函数start=0;value=0;prev=-3;public int getNext()/实现接口DataSeries中的方法getNext()prev=value;value+=3;,10.1.3 接口的实现与使用,return value;public v
22、oid reset()/实现接口DataSeries中的方法reset()start=0;value=0;prev=-3;public void setStart(int x)/实现接口DataSeries中的方法setStart()start=x;value=x;prev=x-3;int getPrevious()/DataSeries接口没有定义的方法return prev;程序中加黑的语句都是由于添加了getPrevious()方法,而改变了接口DataSeries的方法实现。但是这些方法的接口定义没有任何变化,只是实现接口的类中增加了功能代码,这也是接口的优点之一。,10.1.3 接口
23、的实现与使用,2.多个类实现(使用)一个接口【例10.5】我们再用另一个类MyFour来实现接口DataSeries,生成一系列公差为4的数字序列。class MyFour:DataSeries/用另一种方式实现接口DataSeriesint start;int value;public MyFour()/构造函数start=0;value=0;public int getNext()/实现接口DataSeries中的方法getNext()value+=4;,10.1.3 接口的实现与使用,return value;public void reset()/实现接口DataSeries中的方法r
24、eset()start=0;value=0;public void setStart(int x)/实现接口DataSeries中的方法setStart()start=x;value=x;可以把此处定义的类加到【例10.4】中,则在应用类中的对象可以使用MyFour类的方法来生成公差是4的数列。具体代码构成,用户可自己组织。由此可以看出MyThree和MyFour这些类的对象的接口都是DataSeries接口,也就是说,任何一个类的对象都可以分别实例化接口中定义的功能信息,即接口实现了C#的“一个接口,多种方法”的多态性。,10.1.3 接口的实现与使用,3.一个类实现(使用)多个接口使用接口
25、而不使用继承的最大的好处就是,可以在同一个类中同时实现多个接口,即实现多重继承。要实现多个接口,需将这些接口用逗号分开。,10.1.3 接口的实现与使用,【例10.6】在同一个类中实现多个接口。using System;public interface IShape/图形接口IShapedouble Area();/接口方法,计算图形面积double GramLength();/接口方法,计算图形边长int Sides get;/接口属性,获取图形的边长public interface IShapePlay/输出计算结果的接口IShapePlayvoid Play();public class
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 接口代理和事 接口 代理 PPT 课件

链接地址:https://www.31ppt.com/p-5516356.html