《第8章-面向对象程序设计ppt课件(全).ppt》由会员分享,可在线阅读,更多相关《第8章-面向对象程序设计ppt课件(全).ppt(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第8 8章章 面向对象程序设计面向对象程序设计VB.Net 程序程序设计教程教程 本章学习目标:本章学习目标:掌握对象和类概念及其创建方法掌握对象和类概念及其创建方法 掌握命名空间的概念掌握命名空间的概念 掌握属性、方法和事件的设计与处理掌握属性、方法和事件的设计与处理 掌握继承性和多态性的实现方法掌握继承性和多态性的实现方法8.18.1 面向对象程序设计思想面向对象程序设计思想 面向对象编程(面向对象编程(Object Oriented Object Oriented ProgrammingProgramming)是相对于面向过程编程)是相对于面向过程编程(Structure Progra
2、mmingStructure Programming)而言的,它采用面向)而言的,它采用面向对象的思想进行软件的开发,是当今最流行的编程对象的思想进行软件的开发,是当今最流行的编程方法。面向对象技术追求的是软件系统对现实世界方法。面向对象技术追求的是软件系统对现实世界的直接模拟,尽量实现将现实世界中的事物直接用的直接模拟,尽量实现将现实世界中的事物直接用程序代码表达出来。程序代码表达出来。8.18.1 面向对象程序设计思想面向对象程序设计思想 比如,要计算一辆汽车从出厂到当前时刻所行驶的平均时速。我们先不考虑具体步骤,在这个问题中涉及的现实事物是“汽车”,首先在程序中定义一种数据结构直接描述“
3、汽车”,而“总里程数”和“总行驶时间”是“汽车”自身具备的两个数据,把它们添加到这个数据结构中,作为其中的两个成员。而计算平均时速实际上是对两个数据的操作,操作数据的行为称为“方法(Method)”,把这个方法也添加到数据结构中,将它看做汽车的一项功能,执行该方法就得到了结果。汽车数据数据:总里程数、总行驶时间方法方法:计算平均时速(总里程数/总行驶时间)图8-1 用面向对象的方法求汽车平均时速 8.2.1 8.2.1 创建建类 8.2 8.2 类的应用类的应用创建类的步骤:(1)单击【项目】|【添加类】命令,弹出“添加新项”对话框如图8-2所示(2)名称文本框中的内容是新类所在的文件的名称,
4、默认为“Class.vb”,将其改名为“Car.vb”,然后点击“添加”按钮。(3)在解决方案资源管理器中有名为“Car.vb”的文件,它包含了声明类的代码,如图8-3所示。图8-2 “添加新项”图8-3 新建类文件 8.2 8.2 类的应用类的应用声明一个类的语法格式如下:声明一个类的语法格式如下:访问权限修饰符 Class 类名类成员End Class 访问权限修饰符有:访问权限修饰符有:(1)Public 公有成员(2)Private 私有成员(3)Protected 保护成员(4)Friend 友好成员(5)Shared 共享成员8.2 8.2 类的应用类的应用【例例8-18-1】声声
5、明一明一个个“Car”Car”类,用以,用以计算汽算汽车的平均的平均时速。速。Public Class Car Private mileage As Single 总里程 Private time_spend As Single 总计行驶时间 Public Sub SetCarInfo(ByVal mile As Single,_ByVal time As Single)mileage=mile:time_spend=time End Sub Public Function AvrgSpeed()As Single 计算平均时速 AvrgSpeed=mileage/time_spend End
6、 FunctionEnd Class1.1.创建对象创建对象,一般格式如下:Declare As 类名=New 类名(参数)或者:Declare As New 类名(参数)Declare是声明对象变量的关键词字,它可以是Dim、Public、Private、Protected、Friend、Shared和Static。8.2 8.2 类的应用类的应用8.2.2 8.2.2 创建和使用建和使用类的的对象象2.2.访问类成员访问类成员的格式如下:.成员名“.”运算符表示从属关系,后者属于前者的一部分,后者是前者的成员。成员名可以是变量名,也可以是方法名,但它必须是公有的。【例例8-28-2】创建建
7、并并使用使用“Car”Car”类的的对象。在象。在项目中添加一目中添加一个个窗体窗体Form8_2Form8_2,界面如界面如图8-48-4所示所示8.2 8.2 类的应用类的应用用户在前两个文本框中输入“总里程”和“总行驶时间”,点击“计算”按钮,得到“平均时速”输出在第三个文本框中。图8-4 使用Car类的对象 具体操作步骤和源程序参见教材具体操作步骤和源程序参见教材 8.2 8.2 类的应用类的应用8.2.3 8.2.3 定定义属属性性 属性需要用Property语句来创建,属性可以返回值,也可以赋值,返回值和赋值分别由Get属性过程和Set属性过程实现。定义属性语句的一般格式如下:Pu
8、blicReadOnlyWriteOnly Property 属性名()As 数据类型 Get Return 变量名 Get 属性过程 End Get Set(ByVal Value As 数据类型)变量名=Value Set 属性过程 End Set End Property 8.2 8.2 类的应用类的应用定义属性需注意以下几点:定义属性需注意以下几点:(1)属性与它所代理的变量的数据类型必须相同,如果变量声明为Integer类型,属性也必须是Integer类型。(2)语句中的Get属性过程用来读取变量值,Set属性过程用来设置变量值。Value是VB.Net隐性声明的一个变量。当给属性赋
9、值时,Visual Basic 2005隐式地通过名为Value的参数将属性值传送给Set过程,这个值最终赋给变量。(3)如果在属性定义中使用Public关键字,则这个属性必须包含Get属性过程和Set属性过程(4)如果在属性的定义中使用了ReadOnly关键字,那么,该属性只能有Get属性过程,只能读取属性的值,若给该属性赋值,将会导致错误;如果在属性定义中使用了WriteOnly关键字,那么该属性只能有set属性过程,在应用程序中只能对属性赋值,而不能读取属性值。【例例8-28-2】在在“Car”Car”类中添加中添加属属性性来来操作私有成操作私有成员变量。量。具体操作步骤和源程序参见教材
10、具体操作步骤和源程序参见教材 8.2 8.2 类的应用类的应用8.2.4 8.2.4 事件事件处理理 事件是对象能够识别和响应的某些操作,用户可以自己编写代码来处理特定的事件,这样的代码称为事件响应过程,当一个事件发生时,将执行事件响应过程。1 1声声明事件明事件格式:修饰符 Event 事件名(参数列表)注意:共享方法不能访问普通事件,而普通方法可以访问共享事件。2 2引发事件引发事件格式:RaiseEvent 事件名(参数列表)注意:必须在声明事件的范围内引发事件。例如,派生类不能引发从基类继承的事件。3 3事件事件处理程序理程序格式:修饰符 WithEvents 对象名 AS NEW 类
11、名 4 4关关联事件事件与与事件事件处理程序理程序方法一:使用 Handles 关键字和 WithEvents 关键字。方法二:使用AddHandler 和 RemoveHandler 动态地启动和停止特定事件的处理程序。注意:两种途径都可以使用,但不应该对一个事件同时使用 WithEvents 和 AddHandler。AddHandler 和 RemoveHandler 语句要比 Handles 子句更灵活。【例例8-38-3】和和【例例8-48-4】演示了演示了这两种两种方法方法 具体操作步骤和源程序参见教材具体操作步骤和源程序参见教材 8.2 8.2 类的应用类的应用 在类的众多成员中
12、,有两个特殊的方法,即构造方法和析构方法。构造方法是在创建类的实例(也就是对象)时首先执行的过程,析构方法是当实例从内存中销毁前最后执行的过程。8.2.5 8.2.5 构造方法和析构方法构造方法和析构方法 1 1构构造方法造方法 构造方法(又称为New方法)主要用来为对象分配存储空间,完成初始化操作(比如给类的成员变量赋值)。类的构造方法遵循以下规定。(1)构造方法是一个通用过程,任何类的构造方法的过程名都为New,其访问修饰符总是Public。(2)当某个类没有定义构造方法时,系统将自动为其创建一个,这种构造方法称为默认构造方法,它不带参数,方法中没有任何语句。(3)自定义的构造方法可以带参
13、数也可以不带参数。对于带参数的构造方法,创建对象时也必须传递实际参数,并且参数个数要相等,类型要一一对应。对于不带参数的构造方法,创建对象时不能传递参数。(4)构造方法可以被重载(见节)。8.2 8.2 类的应用类的应用自定义构造方法的语法格式如下自定义构造方法的语法格式如下:Public Sub New()声明无参构造方法初始化对象End SubPublic Sub New(参数表)声明带参构造方法初始化对象End Sub 8.2 8.2 类的应用类的应用2 2析析构构方法方法 析构方法(又称Finalize方法)是在对象销毁时(对象离开作用范围或被赋值为Nothing时)被调用,常用来释放
14、对象占用的存储空间。析构方法是一个受保护(Protected)的Sub过程,过程名为Finalize,不能带有参数,不能拥有访问修饰符。程序中不能显式地调用析构方法,它由系统自动调用。下面为Car类添加析构方法。Protected Overrides Sub finalize()MessageBox.Show(析构函数被调用)End Sub8.3 8.3 命名空间命名空间 .Net类库中提供了大量的供程序员引用的类,这些类被声明在不同的命名空间中,程序员在引用.Net类库中的类时,必须指明它所在的命名空间,使用命名空间的方式有两种:(1 1)直接定位命名空间)直接定位命名空间 将类所在的命名空
15、间作为类的前缀例:(2 2)使用)使用ImportsImports关键字关键字 Imports 例:Imports System.Drawing Dim pic As Graphics 8.3.1 8.3.1 使用命名空间使用命名空间 8.3 8.3 命名空间命名空间1.1.自定义命名空间的典型形式自定义命名空间的典型形式NameSpace mynamespacePublic Class myclass1类成员声明End ClassPublic Class myclass2类成员声明End ClassEnd NameSpace8.3.2 8.3.2 自定义命名空间自定义命名空间 注意:同一个命
16、名空间中,不能声明同名的类,而在不同的空间中就可以声明同名的类。2.2.使用命名空间中的类使用命名空间中的类创建类的对象需要指明它们所属的命名空间,例如:Dim obj1 As mynamespace.myclass1或者Imports mynamespaceDim obj1 As myclass18.3 8.3 命名空间命名空间3.3.命名空间的嵌套命名空间的嵌套在一个命名空间中可以声明它的下级空间,基本形式为:NameSpace mynamespace1NameSpace mynamespace2Public Class myclass类成员声明End ClassEnd NameSpace
17、End NameSpace或者:NameSpace mynamespace1.mynamespace2Public Class myclass类成员声明End ClassEnd NameSpace8.4 8.4 继承继承 所谓继承是指一个新类得到了原来类所有的属性和方法,这个新类称为派生类(或子类),原来的类称为基类。派生类还可增加属于自己的新属性和新方法。8.4.1 8.4.1 基类和派生类基类和派生类8.4.2 8.4.2 用用InheritsInherits语句句实现继承承 其格式如下:Class 派生类名 Inherits 基类名 派生类的成员定义End Class【例例8-58-5】
18、建立建立PersonPerson基基类及及它它的派生的派生类StudentStudent和和TeacherTeacher。它们之间的关系如图8-7所示,具体步骤和代码见教材图8-7 类的继承关系图 8.4 8.4 继承继承(1)派生类可以从基类中继承所有的用Public和Friend关键字声明的变量、属性和方法,这些成员在派生类中仍然是Public和Friend成员,可以被派生类的内部代码和派生类的对象访问。(2)派生类不可以从基类中继承用Private关键字声明的变量、属性和方法,这些变量、属性和方法只能在基类中使用。(3)在基类中使用Protected关键字声明的变量、属性和方法,可以被它
19、的派生类继承,这些成员在派生类中仍然是Protected成员,可以被派生类的内部代码访问,但不能被派生类的对象访问。说明:说明:当不存在继承的情况下,Protected成员的可访问性与Private成员是相同的,可以被同属一个类的其它成员访问,而不能被该类的对象访问。8.4.3 8.4.3 基基类成成员在派生在派生类中的作用域中的作用域8.4 8.4 继承继承1 1单一一继承承与与多多层继承承(1)VB.Net规定每个派生类只能有唯一的基类,称为单一继承,但是一个基类可以派生出多个派生类。(2)VB.Net也支持多层继承,即A类派生出B类,B类还可派生C类,向后派生次数没有限制。多层继承具有传
20、递性的特点,若类A派生出类B,类B又派生出类C,则类C不仅继承了类B,同样继承了类A的成员。2.2.禁止禁止继承承与与必必须继承承(1)使用NotInheritable关键字可以声明一个不能被继承的类。(2)使用MustInheritable关键字可以声明一个必须被继承的类,只能作为基类,不能创建对象,但它的派生类可以创建对象。3.3.同名覆盖同名覆盖规则 如果派生类定义了与基类成员同名的新成员,则这个新成员就会覆盖已继承的成员,已继承的这个同名成员将不能被访问(除非使用MyBase关键字显式访问)。8.4.4 8.4.4 类继承的限制承的限制【例例8-68-6】创建基建基类FatherFat
21、her和派生和派生类ChildChild,在派生,在派生类中中声声明明与与基基类成成员同名同名的新成的新成员,测试同名覆盖同名覆盖规则。(具体操作步骤和源程序参见教材具体操作步骤和源程序参见教材)8.4 8.4 继承继承4.4.构构造方法的造方法的调用用顺序序(1)构造方法和析构方法是两种特殊的成员,它们永远不能被继承,如果有必要,可以在派生类中声明自己的构造方法和析构方法。(2)当派生类的构造方法被调用时,基类的构造方法也必然被调用,而且基类的构造方法执行在前,派生类的执行在后。当派生类对象生命期结束时,除非显式调用,否则基类中的析构方法不会被执行。(3)如果基类的New方法需要参数,在声明
22、派生类的New方法时,必须显式调用基类的New方法,向它传递参数,派生类的New方法基本形式如下:Public Sub New(Public Sub New(基类New方法所需参数列表,本类所需参数)MyBase.New(基类New方法所需参数列表).End SubEnd Sub 【例例8-78-7】创建基建基类A A和和它它的派生的派生类B B,测试NewNew方法方法与与finalizefinalize方法的方法的调用。用。【例例8-88-8】修改修改A A类和和B B类的的NewNew方法,方法,实现参数参数传递。8.5 8.5 多态多态(1)重载是指在一个类中声明的多个方法可以具有相同
23、的名称,只要每个方法都有不同的参数列表即可。参数列表不同指的是参数的数据类型不同或参数的个数不同。在实际调用的时候就可以根据传入的参数的情况来选择最适合的一个执行。(2)在同一个类中重载方法时不必使用Overloads关键字,但当重载基类的方法时,必须使用这个关键字。说明:如果不使用Overloads,基类中的同名方法将被覆盖,无法被调用。执行下面的语句会出错。8.5.1 8.5.1 重重载8.5 8.5 多态多态 如果基类的属性或方法需要在派生类中有不同的行为,则可以“重写”它,即可以在派生类中定义该方法的新实现。下列修饰符用于控制如何重写属性和方法:(1)Overridable 允许某个属
24、性或方法在派生类中被重写。(2)Overrides 重写基类中带有 Overridable 关键字的属性或方法。(3)NotOverridable 防止某个属性或方法在派生类中被重写。默认情况下,Public 方法为 NotOverridable。(4)MustOverride 要求派生类必须重写属性或方法。注意:当使用MustOverride 关键字时,方法定义仅由 Sub、Function 或 Property 语句组成。不允许有其他语句,尤其是不能有 End Sub 或 End Function 语句。必须在 MustInherit 类中声明 MustOverride 方法。8.5.2
25、8.5.2 重重写写8.5 8.5 多态多态重写的基本形式重写的基本形式Public Class BaseClass Public Overridable Function add(ByVal a As Integer,_ ByVal b As Integer)As Integer .End FunctionEnd ClassPublic Class InheritsClass Inherits BaseClass Public Overrides Function add(ByVal a As Integer,_ ByVal b As Integer)As Integer .End Func
26、tionEnd Class 重重载与与重重写写的的区区别(1)重载的成员用于提供方法的不同版本,这些版本具有相同名称但是它们接受的参数个数或者参数类型必须不同,否则不是合法的重载。所有重载的版本都是可以访问的,当它们被调用时,系统总是选择那个与实际参数匹配程度最高的版本执行。(2)重写的成员用于替换基类中同名的成员,基类中被重写的成员将无法访问。在派生类中重写基类的方法时,除了方法名称必须相同之外,参数的类型、个数以及返回值类型也必须相同。8.5 8.5 多态多态 接口是封装了成员(属性、方法、事件)原型的集会,它只包含成员的声明部分,描述了变量、属性、方法和事件的特性,而其实现的细节则由类来
27、完成。1 1定定义接口接口 通过Interface 语句定义接口,该语句用来声明接口的名称以及构成接口的成员。格式如下:PrivateFriendPublicProtectedProtected Friend _ Interface 接口名称 Inherits 父接口1,父接口2,Property 属性名 Function 成员名 Sub 成员名 Event 成员名End Interface 8.5.3 8.5.3 接口接口声明接口需要注意以下几点:(1)接口不能包含任何实现语句或与实现相关的语句,如End Sub等。(2)接口中的成员不能指定访问修饰符。8.5 8.5 多态多态2 2接口的接
28、口的实现 类可以实现一个或多个接口,定义类时使用Implements关键字指示它所实现的接口名。基本格式为:Implements 接口名1,接口名2或者Implements 接口名.接口成员名,接口名.接口成员名 注意:注意:用类实现接口时,必须实现接口中的所有成员。【例例8-88-8】声明接口Shape表示图形,在接口中添加3个属性x,y,z表示某种的图形的3个特征值(比如长宽高),以及一个方法volume来计算该图形体积;再定义类Cube和Cylinder分别表示两种具体的图形立方体和圆柱体,这两个类以不同的方式实现Shape接口。8.68.6综合实例综合实例【例例8-98-9】定义一个表
29、示教师信息的类,其中包含公共属性姓名、性别、年龄和一个表示教师所任课程集合的ArrayList型字段,也包含初始化各属性的New方法和ArrayList元素的增减方法。再设计如下界面用于更改和显示教师的信息,点击“更新”按钮将各个文本框的值赋给类中对应成员,在“添加任课”文本框中输入课程名再点“更新”,将新课程加入到集合,并显示在“任课”列表中,在“删除任课”文本框输入要删除的课程名再点击“更新”,就将该课程从集合中删除。具体操作步骤和源程序参见教材具体操作步骤和源程序参见教材 图8-14 操作类(1)创建项目(2)设计程序界面(3)编写程序代码 8.78.7实训项目八实训项目八 在D盘创建文件夹Stu8,按要求完成如下实训练习,保存在D:Stu8路径下。新建一个项目Proj8,改进例8-9中的代码,以继承的方式实现教师类TeacherCls和学生类StudentCls。设计两个类的公共基类Person,其中包含公共的属性姓名、性别、年龄以及对这些属性初始化的New方法。此外,在教师类中有ArrayList型字段,它表示教师所任课程集合,在学生类中有一个String型数组字段和一个Decimal型数组字段,用来表示学生所修课程以及成绩。分别在两个类中定义增减这些字段的方法以及初始化这些字段的New方法。