[工学]《C面向对象程序设计》第7章:多态性课件.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《[工学]《C面向对象程序设计》第7章:多态性课件.ppt》由会员分享,可在线阅读,更多相关《[工学]《C面向对象程序设计》第7章:多态性课件.ppt(30页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第7章章 多态性多态性主要内容与学习目标主要内容与学习目标7.1 抽象方法与抽象类抽象方法与抽象类7.2 接口接口7.3 代理代理7.4 事件事件主要内容与学习目标主要内容与学习目标l主要内容:主要内容:(1)声明抽象类、声明抽象方法和属性。声明抽象类、声明抽象方法和属性。(2)实现抽象类、实现抽象方法和属性、抽象方法和属性的特点。实现抽象类、实现抽象方法和属性、抽象方法和属性的特点。(3)抽象类作为方法参数的类型。抽象类作为方法参数的类型。(4)从抽象类派生抽象类、抽象类的特点。从抽象类派生抽象类、抽象类的特点。(5)抽象类变量、动态绑定。抽象类变量、动态绑定。(6)声明接口及接口成员。声
2、明接口及接口成员。(7)实现接口、实现接口方法、实现接口属性。实现接口、实现接口方法、实现接口属性。(8)接口的属性、基于接口的多态性。接口的属性、基于接口的多态性。(9)接口与抽象类的区别。接口与抽象类的区别。(10)抽象类实现接口、将接口方法映射到抽象方法上。抽象类实现接口、将接口方法映射到抽象方法上。(11)一个类实现多个接口。一个类实现多个接口。(12)声明代理、调用代理。声明代理、调用代理。(13)代理的作用。代理的作用。(14)多路广播代理。多路广播代理。(15)声明事件的代理。声明事件的代理。(16)声明及使用自定义事件。声明及使用自定义事件。(17)定义及使用持有事件数据的类。
3、定义及使用持有事件数据的类。l学习目标:学习目标:(1)理解多态性是如何实现系统的可扩展和可维护的。理解多态性是如何实现系统的可扩展和可维护的。(2)理解抽象类和具体类之间的差异。理解抽象类和具体类之间的差异。(3)学会如何创建及使用接口和代理。学会如何创建及使用接口和代理。(4)理解事件与代理的关系及如何使用事件。理解事件与代理的关系及如何使用事件。7.1 抽象方法与抽象类抽象方法与抽象类l基类的虚拟方法有时候不可能被调用到,这时候可定义该虚拟方法为抽象方法,抽象方法没有方法体,但非声基类的虚拟方法有时候不可能被调用到,这时候可定义该虚拟方法为抽象方法,抽象方法没有方法体,但非声明不可,它告
4、诉编译器,派生类必须通过重写该方法以提供它们自己的实现。明不可,它告诉编译器,派生类必须通过重写该方法以提供它们自己的实现。l当实例方法声明包含当实例方法声明包含abstract修饰符时,称该方法为抽象方法。虽然抽象方法同时隐含为虚拟方法,但是它不修饰符时,称该方法为抽象方法。虽然抽象方法同时隐含为虚拟方法,但是它不能有能有virtual修饰符。修饰符。l在类声明中使用在类声明中使用abstract修饰符以指示类只能是其他类的基类,我们称它为抽象类。含有一个或一个以上的抽修饰符以指示类只能是其他类的基类,我们称它为抽象类。含有一个或一个以上的抽象成员的类,必须定义为抽象类。但必须注意抽象类可以
5、不包含抽象成员。象成员的类,必须定义为抽象类。但必须注意抽象类可以不包含抽象成员。l抽象类不能实例化,必须在继承类中实现。它可以包含已实现的方法和属性,但也可以包含未实现的方法和属抽象类不能实例化,必须在继承类中实现。它可以包含已实现的方法和属性,但也可以包含未实现的方法和属性,这些未实现方法和属性必须在继承类中实现。当需要一组相关组件来包含一组具相同功能的方法,但同时性,这些未实现方法和属性必须在继承类中实现。当需要一组相关组件来包含一组具相同功能的方法,但同时要求在其他方法实现中具有灵活性时,可以使用抽象类。抽象类的另一个好处是:当要求组件的新版本时,可要求在其他方法实现中具有灵活性时,可
6、以使用抽象类。抽象类的另一个好处是:当要求组件的新版本时,可根据需要将附加方法添加到基类,但抽象方法和属性必须保持不变。根据需要将附加方法添加到基类,但抽象方法和属性必须保持不变。l抽象类的目的是提供一个合适的基类,以派生其他的类。例如,我们可以有抽象类抽象类的目的是提供一个合适的基类,以派生其他的类。例如,我们可以有抽象类TwoDimensionalShape,并从该类派生诸如并从该类派生诸如Rectangle、Circle和和Ellipse等具体类。还可以有抽象类等具体类。还可以有抽象类ThreeDimensionalShape,并从该,并从该类派生诸如类派生诸如Cube、Sphere和和
7、Cylinder等具体类。等具体类。l继承层次结构并不一定需要包含抽象类。然而,却经常在类层次结构的顶部添加抽象类以减少客户代码对特定继承层次结构并不一定需要包含抽象类。然而,却经常在类层次结构的顶部添加抽象类以减少客户代码对特定子类类型的依赖。抽象类有时构成若干级别的层次结构。例如,子类类型的依赖。抽象类有时构成若干级别的层次结构。例如,图图7.1中的形状层次结构,该层次结构的顶部为中的形状层次结构,该层次结构的顶部为抽象类抽象类Shape。该层次结构的下一级是另外两个抽象类,即。该层次结构的下一级是另外两个抽象类,即TwoDimensionalShape和和ThreeDimensional
8、Shape。该层次结构的第三级为二维形状声明了具体类。该层次结构的第三级为二维形状声明了具体类(Rectangle、Circle和和Ellipse),也,也为三维形状声明了具体类为三维形状声明了具体类(Cube、Sphere和和Cylinder)。注意,图中抽象类的名称以斜体字出现。注意,图中抽象类的名称以斜体字出现。l7.1.1 抽象方法和抽象属性抽象方法和抽象属性l7.1.2 抽象类继承抽象类继承图7.1 Shape一般化/特殊化层次结构7.1.1 抽象方法和抽象属性抽象方法和抽象属性l抽象方法或属性是方法或属性声明中包含抽象方法或属性是方法或属性声明中包含abstract修饰符的方法或属
9、性,派生类必修饰符的方法或属性,派生类必须重写该方法或属性。注意抽象方法或属性没有方法体或属性访问器。须重写该方法或属性。注意抽象方法或属性没有方法体或属性访问器。l任务任务7.1:多态性及实现:多态性及实现(一一)问题描述:定义一抽象类问题描述:定义一抽象类Shape。抽象类。抽象类Shape包含包含x和和y两个属性、两个属性、Volume虚拟方法、虚拟方法、Area抽象方法和只读抽象方法和只读Name抽象属性。不同的形状类按继承关系建立抽象属性。不同的形状类按继承关系建立如如Point类实现类实现 Shape类;类;Rectangle类继承类继承Point类;类;Ellipse类继承类继承
10、Rectangle类;类;Circle类继承类继承Ellipse类;类;Cylinder类继承类继承Circle类。创建每个类的实例,并将每个类的实例存放于类类。创建每个类的实例,并将每个类的实例存放于类型为型为Shape的数组中。以该的数组中。以该Shape的数组作为参数,调用参数的类型为的数组作为参数,调用参数的类型为Shape数组的数组的ShowShapinfo方法,通过调用重写的方法和属性为相应的图形对象计算表面积,体积方法,通过调用重写的方法和属性为相应的图形对象计算表面积,体积并输出图形的名称。并输出图形的名称。本示例的继承结构如同任务本示例的继承结构如同任务6.8。只是本示例的层
11、次结构开始于抽象。只是本示例的层次结构开始于抽象类类Shape。Shape类声明了该层次结构的类声明了该层次结构的“接口接口”即程序可用于调用所有即程序可用于调用所有Shape类类对象的一组方法。对象的一组方法。图图7.2中的类图开始于抽象类中的类图开始于抽象类Shape。在。在Shape类中,我们将类中,我们将Area方法方法声明为抽象方法,声明为抽象方法,Name属性声明为抽象属性,因为实现它们没有什么意义。我们将属性声明为抽象属性,因为实现它们没有什么意义。我们将Volume方法声明为虚拟方法且返回值为方法声明为虚拟方法且返回值为0,因为二维图形的面积为,因为二维图形的面积为0,且实现,
12、且实现Shape类的类的三维图形必须重写三维图形必须重写Volume方法。方法。分析:分析:Point类实现类实现 Shape类,类,Point类继承类继承Shape类的类的 x 和和 y属性、属性、Volume虚拟方法,虚拟方法,实现实现Shape类的类的Area抽象方法和只读抽象方法和只读Name抽象属性,抽象属性,Area方法的返回值应为方法的返回值应为0,Name属性的值应为属性的值应为“点点”。Rectangle类继承类继承Point,Rectangle类有自己的两个属性类有自己的两个属性Height和和Width。Rectangle类必须重写类必须重写Area方法和方法和Name属
13、性。属性。Ellipse类继承类继承Rectangle类,类,Circle类继承类继承Ellipse类,类,Cylinder类从类从Circle类继承而来,类继承而来,Cylinder类从类从Circle类继承了类继承了方法方法Area及属性及属性Name和方法和方法Volume。与圆形相比,圆柱体的表面积和体积计算方法有。与圆形相比,圆柱体的表面积和体积计算方法有所不同,名称也不同,因此所不同,名称也不同,因此Cylinder类必须重写这些方法和属性。类必须重写这些方法和属性。图7.2 Shape层次结构的类图7.1.2 抽象类继承抽象类继承l在类声明中使用在类声明中使用MustInheri
14、t修饰符以指示类只能是其他类的基类,我们称它为修饰符以指示类只能是其他类的基类,我们称它为抽象类。含有一个或一个以上的抽象成员的类,必须定义为抽象类。但抽象类不抽象类。含有一个或一个以上的抽象成员的类,必须定义为抽象类。但抽象类不一定包含抽象成员。抽象类可以完全实现,但更常见的是部分实现或者根本不实一定包含抽象成员。抽象类可以完全实现,但更常见的是部分实现或者根本不实现,从而封装继承类的通用功能。抽象类可以继承其他抽象类,当然,抽象类可现,从而封装继承类的通用功能。抽象类可以继承其他抽象类,当然,抽象类可以继承其他非抽象类,在实际中,抽象类继承非抽象类很少见。以继承其他非抽象类,在实际中,抽象
15、类继承非抽象类很少见。l任务任务7.2:多态性及实现:多态性及实现(二二)问题描述:问题描述:声明声明图图7.1中除中除Ellipse和和Sphere外的每个类,每个外的每个类,每个TwoDimensionalShape类都应包含一个类都应包含一个Area方法,用以计算二维图形的面积,每个方法,用以计算二维图形的面积,每个ThreeDimensionalShape都应包含都应包含Area方法和方法和Volume方法,分别用于计算三维图形方法,分别用于计算三维图形的表面积和体积。创建一个程序,使用一个的表面积和体积。创建一个程序,使用一个Shape数组。其元素保存层次结构中每个具数组。其元素保存
16、层次结构中每个具体类的对象的引用,该程序应打印每个数组元素所引用数组的对象。此外,在处理数组体类的对象的引用,该程序应打印每个数组元素所引用数组的对象。此外,在处理数组的所有图形的循环中,判断每个图形是的所有图形的循环中,判断每个图形是TwoDimensionalShape还是还是ThreeDimensionalShape。如果图形是。如果图形是TwoDimensionalShape,则显示其面积和周,则显示其面积和周长。如果是长。如果是ThreeDimensionalShape,则显示其表面积和体积。,则显示其表面积和体积。解决方案:解决方案:l(1)创建一空项目创建一空项目Abstract
17、Class。向项目中添加代码文件:。向项目中添加代码文件:l(2)添加引用添加引用System.Windows.Forms,并将输出类型设置为,并将输出类型设置为【Windows应用程序应用程序】。l(3)按按F5键编译并运行应用程序,输出结果键编译并运行应用程序,输出结果如图如图7.5所示所示。图7.5 抽象类继承7.2 接口接口l在在C#中类只能实现中类只能实现“单一继承单一继承”,要实现多重继承,必须使用接口。也就是说,类,要实现多重继承,必须使用接口。也就是说,类可以实现无限多个接口,但仅能从一个抽象可以实现无限多个接口,但仅能从一个抽象(或任何其他类或任何其他类)类继承。从抽象类派生
18、类继承。从抽象类派生的类仍可实现接口。的类仍可实现接口。l一个接口定义一个协定,实现接口的类或结构必须遵守其协定。接口可以从多个基一个接口定义一个协定,实现接口的类或结构必须遵守其协定。接口可以从多个基接口继承,而类或结构可以实现多个接口。接口声明可以声明零个或多个成员,接接口继承,而类或结构可以实现多个接口。接口声明可以声明零个或多个成员,接口的成员必须是方法、属性、事件或索引器。接口不能包含常数、字段、运算符、口的成员必须是方法、属性、事件或索引器。接口不能包含常数、字段、运算符、实例构造函数、析构函数或类型,也不能包含任何种类的静态成员。接口本身不提实例构造函数、析构函数或类型,也不能包
19、含任何种类的静态成员。接口本身不提供它所定义的成员的实现,接口只指定实现该接口的类或接口必须提供的成员。供它所定义的成员的实现,接口只指定实现该接口的类或接口必须提供的成员。l所有接口成员都隐式地具有所有接口成员都隐式地具有public访问权限。接口成员声明包含任何修饰符都将导访问权限。接口成员声明包含任何修饰符都将导致编译时错误。具体地说,接口成员包含下列任何修饰符时都会出现编译时错误:致编译时错误。具体地说,接口成员包含下列任何修饰符时都会出现编译时错误:abstract、public、protected、internal、private、virtual、override、static。7
20、.2.1 声明和实现接口声明和实现接口7.2.2 接口成员的显式实现接口成员的显式实现7.2.3 接口和抽象类接口和抽象类7.2.4 接口与抽象类的比较接口与抽象类的比较7.2.1 声明和实现接口声明和实现接口l理这些完全不同类的对象。例如,分别代表经理、温度、汽艇的类的对象的功能完全不同,但这些类的对象理这些完全不同类的对象。例如,分别代表经理、温度、汽艇的类的对象的功能完全不同,但这些类的对象有一些通用的属性和操作,那就是它们所属的类别和对自己的描述。一个温度类的对象有一些通用的属性和操作,那就是它们所属的类别和对自己的描述。一个温度类的对象32,它所属的类别,它所属的类别为温度,其描述为
21、为温度,其描述为“华氏温度值:华氏温度值:32,摄氏温度值:,摄氏温度值:0”。一个经理类的对象王非,其描述为。一个经理类的对象王非,其描述为“姓名:王姓名:王非,基本工资:非,基本工资:8000”。下面我们声明一接口。下面我们声明一接口IThing来提供这些通用的功能,然后声明来提供这些通用的功能,然后声明Temperature类,类,Manager类,这些类都实现接口类,这些类都实现接口IThing。l任务任务7.3:创建和使用接口:创建和使用接口问题描述:问题描述:l(1)创建接口。创建一名为创建接口。创建一名为IThing的接口,该接口为所有对象提供通用功能,它有两个成员:只的接口,该
22、接口为所有对象提供通用功能,它有两个成员:只读读Type属性和属性和TellAboutSelf方法,方法,Type属性返回对象的所属类别,属性返回对象的所属类别,TellAboutSelf方法返回对方法返回对象的自描述。象的自描述。l(2)实现接口。创建实现接口。创建Temperature(温度温度)类,该类实现类,该类实现IThing接口。接口。Temperature类还有两个属类还有两个属性:华氏温度性:华氏温度(Value)和摄氏温度和摄氏温度(Celsius),华氏温度和摄氏温度的关系为:,华氏温度和摄氏温度的关系为:Value=9/5*Celsius+32。创建。创建Manager(
23、经理经理)类,该类实现类,该类实现IThing接口,接口,Manager类还有类还有3个个属性:属性:Name(姓名姓名)、Salary(基本工资基本工资)、BornDay(出生日期出生日期)。BornDay的类型为的类型为DateTime类型。类型。l(3)创建测试程序,该程序创建一个创建测试程序,该程序创建一个IThing变量数组,该数组存储实现接口的各个具体类的对象变量数组,该数组存储实现接口的各个具体类的对象的引用,利用循环结构,打印每个数组元素所引用对象的信息。的引用,利用循环结构,打印每个数组元素所引用对象的信息。解决方案:解决方案:l(1)创建一空项目创建一空项目Interfac
24、eApp。l(2)声明接口声明接口IThing。向该项目中添加代码文件。向该项目中添加代码文件l(3)实现接口实现接口IThing。再向该项目中添加代码文件。再向该项目中添加代码文件ImplementsInterface.cs:l(4)向项目中添加测试类向项目中添加测试类l(5)添加引用添加引用System.Windows.Forms,并将输出类型设置为,并将输出类型设置为【Windows应用程序应用程序】。l(6)按按F5键编译并运行应用程序,输出结果键编译并运行应用程序,输出结果如图如图7.6所示所示。图7.6 不同类的对象的多态演示7.2.2 接口成员的显式实现接口成员的显式实现l如果两
25、个接口具有相同的成员名称,实现接口的类为每个接口成员提供一个单独的实现,这如果两个接口具有相同的成员名称,实现接口的类为每个接口成员提供一个单独的实现,这时必须采用接口成员的显式实现。接口成员的显式实现是指实现接口的成员时成员名称使用时必须采用接口成员的显式实现。接口成员的显式实现是指实现接口的成员时成员名称使用完全限定接口成员名。完全限定接口成员名包含声明该成员的接口的名称,后跟一个点,再完全限定接口成员名。完全限定接口成员名包含声明该成员的接口的名称,后跟一个点,再后跟该成员的名称。后跟该成员的名称。l任务任务7.4:用接口实现不同的度量衡系统:用接口实现不同的度量衡系统 问题描述:声明两
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 工学 C面向对象程序设计 面向 对象 程序设计 多态性 课件
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内