面向对象程序设计(1).ppt_第1页
面向对象程序设计(1).ppt_第2页
面向对象程序设计(1).ppt_第3页
面向对象程序设计(1).ppt_第4页
面向对象程序设计(1).ppt_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

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

文档简介

第6章 面向对象程序设计,本章要点 面向对象的基本概念 类的定义与对象的声明 构造函数和析构函数 类的静态成员和实例成员 类的继承与多态性的编程实现 接口的实现,6.1面向对象程序设计概述 6.2类和对象 6.2.1类的声明 6.2.2对象和类成员 6.2.3 域与属性 6.2.4 静态方法和非静态方法 6.2.5 构造函数和析构函数 6.3 方法的重载 6.4 类的继承 6.5 接口,第6章 面向对象程序设计,6.1面向对象程序设计概述,面向对象的程序设计是一种基于结构分析的、以数据为中心的程序设计方法。面向对象的程序设计方法总体思路是:将数据及处理这些数据的操作都封装(Encapsulation)到一个称为类(Class)的数据结构中,在程序中使用的是类的实例对象。对象是代码与数据的集合,是封装好了的一个整体,对象具有一定的功能。也就是说对象是具有一定功能的程序实体。程序是由一个个对象构成的,对象之间通过一定的“相互操作”传递消息,在消息的作用下,完成特定的功能。,6.1面向对象程序设计概述,面向对象技术的优点: 1.维护简单 模块化是面向对象编程中的一个特征。实体被表示为类和同一名字空间中具有相同功能的类,我们可以在名字空间中添加一个类而不会影响该名字空间的其他成员。 2.可扩充性 面向对象编程从本质上支持扩充性。如果有一个具有某种功能的类,就可以很快地扩充这个类,创建一个具有扩充的功能的类。,3.代码重用 由于功能是被封装在类中的,并且类是作为一个独立实体而存在的,提供一个类库就非常简单了。事实上,任何一个.NET Framework编程语言的程序员都可以使用.NET Framework类库,.NET Framework类库提供了很多的功能。并且可以通过提供符合需求的类来扩充这些功能。,6.1面向对象程序设计概述,6.1面向对象程序设计概述,面向对象具有三个基本特征:封装、继承和多态,如下图,6.1面向对象程序设计概述,1.封装 所谓的封装,就是将用来描述客观事物的一组数据和操作组装在一起,形成一个类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装是是对象和类概念的主要特性。,6.1面向对象程序设计概述,2.继承 面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。通过继承创建的新类称为“子类”或“派生类”。被继承的类称为“基类”、“父类”或“超类”。,6.1面向对象程序设计概述,继承概念的实现方式有三类:实现继承、接口继承和可视继承。 实现继承是指使用基类的属性和方法而无需额外编码的能力; 接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力; 可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力。,6.1面向对象程序设计概述,3.多态 多态性(polymorphisn)是允许程序设计者将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单来说多态性就是在程序运行时,面向对象的语言会自动判断对象的派生类型,并调用相应的方法。 实现多态有二种方式,覆盖和重载。,6.1面向对象程序设计概述,方法的覆盖是指子类重新定义父类的同名函数。 方法的重载与方法的覆盖不同,方法的重载不是子类对父类同名方法的重新定义,而是同一类中若干同名方法的重新定义。这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。方法名称一样,但如果参数不同,就会有不同的具体实现。系统仅通过参数列表选择匹配的方法定义。,6.2类和对象,对象 对象就是现实世界中存在的“东西”,例如一张桌子、一盏灯、一个人都可以看成是对象。对象(object)是现实世界的物体经过抽象,映射为计算机程序里的元素,它包括了一组相关的特性和行为方法。对象有时也称为类的实例(instance)。,6.2类和对象,类: 通常把具有同样性质和功能的东西所构成的集合叫作类(class),它是用来创建对象的模板。对象在程序中是通过一种抽象数据类型来描述的,这种抽象数据类型称为类(class)也就是说,类包括了一组特定对象的相同特性。从同一个类创建出来的每个对象就算不是完全一样,也都具有许多相同的特性和行为方法。,6.2类和对象,使用类和对象的好处有: 通过模块化来维护代码。 代码对最终用户封装了内部复杂性。 跨应用程序重用代码。 支持单一接口实现多个方法。,6.2.1类的声明,1类的声明 VB.NET中,类的创建是通过在关键字class和End Class中声明类的名称,以及构成该类的变量、属性、事件和方法的定义,其中End Class 用于终止 Class 块。 其格式如下: 类修饰符class 类名 Inherits 父类名 Implements 接口名 成员定义列表; End Class,6.2.1类的声明,(1)类的修饰符 类的修饰符可以取Public 、Private、Protected、Friend、Protected Friend几类值之一。默认情况下,没有指定访问修饰符的类将声明为 Friend。各取值的说明如下: Public :可选项。用 Public 修饰符声明的实体具有公共访问权限。 Private :可选项。用 Private 修饰符声明的实体具有私有访问权限。私有实体只在其声明上下文中是可访问的。 Protected :可选项。用 Protected 关键字声明的实体具有受保护的访问权限。仅可以从其自己的类或派生类中访问它们。只能对类成员指定受保护的访问。,6.2.1类的声明,Friend :可选项。用 Friend 修饰符声明的实体具有友元访问权限。具有友元访问权限的实体只有在包含此实体声明的程序内才是可访问的。默认情况下,没有指定访问修饰符的类将声明为 Friend。 Protected Friend :可选项。用 Protected Friend 修饰符声明的实体同时具有受保护访问权限和友元访问权限。,6.2.1类的声明,(2)Shadows :可选项。指示此类隐藏基类中的同名编程元素。可以用其他任何类型的元素来隐藏任何类型的被声明元素。被隐藏的元素在隐藏它的派生类内不可用,除非隐藏元素不可访问,例如,如果元素声明为 Private。 (3)MustInherit :可选项。指示只能通过派生类访问 Class 的非共享成员。不能创建必须继承的类的实例。 (4)NotInheritable:可选项。指示 Class 是不允许进一步继承的类。,6.2.1类的声明,(5)类名:必选项。Class 的名称;符合标准变量命名规则。 (6)Inherits:可选项。指示该类继承了另一个类的成员。类可以只继承一个其他类。 (7)Implements :可选项。指示该类实现了接口的成员。如果使用 Implements 语句,那么它必须在 Class 语句之后并紧靠 Inherits 语句的后面,而且必须实现由接口定义的所有成员。,6.2.1类的声明,例6-1:为一个宠物商店编写一个程序,来管理它收养和卖出的宠物的状况。 Public Class Pet Private mstrName As string Public PropertyName As string Get Return mstrName End Get Set(ByVal Value As string) mstrName = Value End Set End Property Public Sub Move() console.writeline(“Pet” & mstrname & “is moving!” ) End sub End Class,6.2.1类的声明,代码中定义了一个名叫Pet的类,Public表示该类是公有的,在程序的其它地方都可以“看见”它并进行访问。代码中的第二句Private mstrName as String定义了类的一个“成员”变量,它规定,根据这个类实例化出来的每个对象,都必须包含一个叫做mstrName的字符串,而Private表示在这个类的外部,没有办法“看见”这个字符串,所以在类的外部不能使用这个变量。,6.2.1类的声明,接下来的 Public Property Name as string Get Return mstrName End Get Set(ByVal Value as string) mstrName = Value End Set End Property 定义了类的一个属性,这个属性叫做Name,也就是前面说的“宠物的名字”。关键字Property用来定义一个属性。属性也有它的类型,这里Name属性定义为String类型。,6.2.1类的声明,而当顾客想知道这只宠物叫什么名字时,就用下面的代码: Get Return mstrName End Get 这段代码用来回答这个问题,Get表示获取,Return表示返回,返回了宠物的名字。 当然顾客(或者商店)可有可能自己想给宠物起个名字,为了处理这类事情,就需要用set: Set(ByVal Value as string) mstrName = Value End Set Set表示设置,也就是说,这一段表示应该怎样处理“如何给宠物起新名字”的事情。,6.2.1类的声明,后三行代码: Public Sub Move() console.writeline(“Pet” & mstrname & “is moving!” ) End sub 定义了宠物有Move(移动)的行为,这是一个宠物类的一个方法。有了这个方法,如果有顾客想让宠物“动一动”,程序就知道该怎么处理了。,6.2.1类的声明,对类命名时,推荐使用Pascal语言的命名规则。根据这种命名规则,就意味着类名的第一个字母必须大写,并且后面的并发连结词的第一个字母均为大写,6.2.2对象和类成员,1.对象 定义格式如下: Dim 实例名As New 类名(参数) 要创建类的实例,要使用 New 关键字。与值类型(如 Integer 和 Double)不同,对象是引用类型,必须显式创建后方可使用。,6.2.2对象和类成员,例如,请看下列两行代码: Dim Button1 As System.Windows.Forms.Button Dim Button2 As New System.Windows.Forms.Button() 第一个语句声明的对象变量包含对按钮对象的引用。但是没有用New关键字创建,变量 Button1 一直包含值 Nothing,直到将 Button 类型的对象分配给它。第二个语句也定义了可包含按钮对象的变量并使用 New 关键字创建了一个按钮对象,然后将它分配给变量 Button2。,6.2.2对象和类成员,实例化还可以用这样的语句: Dim p As Pet p = New Pet() 这是分成两步走,第一步为“我需要一个对象,它的名字是p,准备从Pet类实例化(但现在并不实例化)”;第二步为“实例化一个Pet类的对象,然后把它指定给p”。无论如何,一旦实例化以后,p就是真正的代表一个宠物了。,6.2.2对象和类成员,2.类成员 类的具体成员有以下几类: 常量:用来定义与类相关的常量值。 字段:类中的变量,相当于C+中的成员变量。 类型:用来定义只能在类中使用的局部类型。 方法:完成类中各种计算或功能的操作。 属性:定义类的特征,并对它们提供读、写操作。,6.2.2对象和类成员,事件:由类产生的通知,用于说明发生了什么事情。 索引器:允许编程人员在访问数组时,通过索引器访问类的多个实例。又称下标指示器。 运算符:定义类的实例能使用的运算符。 构造函数:在类被实例化时首先执行的函数,主要是完成对象初始化操作。 析构函数:在对象被销毁之前最后执行的函数,主要是完成对象结束时的收尾操作。,3.类的静态成员和实例成员,6.2.2对象和类成员,3.类的静态成员和实例成员 类的成员又可以分成静态成员和非静态成员。 VB.NET中在声明成员时,如果在语句前加上Shared保留字,则该成员是静态成员,如果没有Shared保留字,则成员是非静态成员。 二者最重要的区别是:静态成员属于类所有,非静态成员属于类的实例所有,所以又称实例成员。 例如:,Public Class MyClass Public InstanceValue As String Public Shared SharedValue As String Public Shared Sub ShareMethod() MsgBox(“This is a shared method.“) End Sub End Class Sub TestShared() Dim Shared1 As New MyClass() Dim Shared2 As New MyClass() Shared1.SharedValue = “FirstValue“ Shared2.SharedValue = “SecondValue“ MsgBox(“第一个实例对象的共享字段SharedValue的值为: “ & Shared1.SharedValue) MsgBox(“第二个实例对象的共享字段SharedValue的值为:“ & Shared2.SharedValue) MyClass.ShareMethod() End Sub,6.2.3 域与属性,域又称字段,它是类的一个成员,这个成员代表与对象或类相关的变量。域的定义格式如下。 域修饰符|Dim 域名 As 域类型,6.2.3 域与属性,例如:Dim a As Integer Public b As String 属性是对现实世界中实体特征的抽象,它提供了一种对类或对象特性进行访问的机制。属性用关键字property声明,格式如下。 Property 属性名() As 属性类型 Get End Get Set(ByVal Value As 数据类型) End Set End Property,示例如下: Private MonthNum As Integer = 1 Internal storage for property value. Property Month( ) As Integer Get Return MonthNum End Get Set(ByVal Value As Integer) If Value 12 Then Msgbox(”The value is wrong!”) Else MonthNum = Value End If End Set End Property Month,6.2.4 静态方法和非静态方法,VB.NET中分为静态方法和非静态方法。静态方法又称“共享方法”,属于类所有必须通过类访问。非静态方法又称“非共享方法”或是“实例方法”,通过类的实例访问。,例6-2:静态方法和非静态方法的演示。请观察并分析下列程序的执行结果。 Class MethodDemo1 Dim s1 As String = “ Dynamic var!“ Shared s2 As String = “static var!“ Function add(ByVal x As Single, ByVal y As Single) As Single Dim z As Single z = x + y Console.Write(s1&s2) Return z End Function Shared Function Subtraction(ByVal x As Single, ByVal y As Single) As Single Dim w As Single w = x y Console.Write(s2) Return w End Function End Class Private Sub TestMethod() Dim result1, result2 As Single Dim addCall As New MethodDemo1 result1 = addCall.add(3, 5) result2 = MethodDemo1.Subtraction(3, 5) Console.Write(“result1=“ & result1 & “,result2=“ & result2) End Sub,6.2.5 构造函数和析构函数,1构造函数 构造函数主要用来为对象分配存储空间,完成初始化操作(如给类的成员变量赋值等)。构造函数在程序开始之后或在创建类型的实例时运行。,构造函数有两种:共享的构造函数和实例化构造函数 。 共享的构造函数用来初始化一个类型的共享变量。使用Shared关键字创建并且存储能够被类的所有实例共享的值。 实例化构造函数用来初始化用关键字Dim、Public、Private、Friend、Protected 和 Protected Friend 声明的变量。在实例化构造函数中也可以访问共享变量。,在VB.NET中构造函数是通过使用保留的方法New来创建的。请看例6-3: Imports System.Collections Class A Private x As Integer = 1 Private y As Integer = - 1 Private count As Integer Public Sub New() count = 0 End Sub Public Sub New(n As Integer) count = n End Sub End Class Class B Inherits A Public Sub New() Me.New(100) End Sub Public Sub New(n As Integer) MyBase.New(n-1) End Sub End Class,6.2.5 构造函数和析构函数,2析构函数 析构函数是用来从内存中释放一个类的实例的特定的方法。VB.NET中的析构函数分为两种:Finalize()和Dispose()。 Finalize()析构函数是被一个类自身或者它的子类调用的特殊方法。Finalize()析构函数在对一个对象最后一条引用从内存中释放时候被调用。,6.2.5 构造函数和析构函数,Dispose()方法被调用来释放对象不再使用的资源,如数据库连接。Dispose()方法 不是自动调用 的,当一个对象不再被需要的时候必须从客户程序显式地调用这个方法。 IDisposable 接口包含Dispose() 方法。因此,为了调用Dispose()方法,类必须实现 IDisposable 接口。,6.3 方法的重载,方法重载是指同样的一个方法名,有多种不同的实现方法,用关键字overloads表示重载。 下面几种情况是不能重载成功的: 重载的方法只是和原方法类型成员的修饰符不同(例如,Shared 或 Private)。 重载的方法只是和原方法参数修饰符不同(例如,ByVal 或 ByRef)。 重载的方法只是和原方法参数名称不同。 重载的方法只是和原方法的返回类型不同。 重载的方法只是和原方法属性的元素类型不同。,下面的看一组重载示例,其中有的重载方式正确,有的错误。 Interface A Sub Test () 正确 Sub Test (x As Integer) 正确 Sub Test (ByRef x As Integer) Sub Test (x As Integer) 错误!重载的方法只是和原方法参数修饰符不同 Sub Test (x As Integer, y As Integer) 正确 Function Test (s As String) As Integer 正确 Function Test (r As String) As Integer 错误!重载的方法只是和原方法Function Test (s As String) As Integer参数名称不同。 Function Test(s As String) As String 错误!重载的方法只是和原方法Function Test (s As String) As Integer的返回类型不同。 End Interface,6.4 类的继承,VisualBasic.NET引入了下列类级别语句和修饰符以支持继承: Inherits语句指定基类。 NotInheritable修饰符防止程序员将该类用作基类。 MustInherit修饰符指定该类仅适于用作基类。无法直接创建MustInherit 类的实例,只能将它们创建为派生类的基类实例。(其他编程语言,如C+和C#,使用术语“抽象类”来描述这样的类。),6.4 类的继承,1.继承的实现 例6-3:假设定货都有一个线路项,这个线路项又包含了产品线路项和服务线路项。这两种线路项是有些不同,但是当我们在分开实现ProductLine和ServiceLine类的时候,发现又有许多相同之处。如果分开编写这两个类的代码,不仅编程效率低,而且程序代码也难以维护,所以最好的方法就是使用它们一些相同的代码。为了实现使用相同的代码,继承就起了很大的作用了。使用继承,我们可以创建一个LineItem类(父类),它包含了所有的共用代码。然后我们再创建ProductLine和ServiceLine子类,这两个类是由LineItem继承而来的。这样它们就可以自动地获得所有的共用代码了。定义类LineItem的代码如下:,Public Class LineItem Private mintID As Integer Private mstrItem As String Private msngPrice As Single Private mintQuantity As Integer Public Property ID() As Integer Get Return minted End Get Set mintID = value End Set End Property Public Property Item() As String Get Return mstrItem End Get Set mstrItem = Value End Set End Property,Public Property Price() As Single Get Return msngPrice End Get Set msngPrice = Value End Set End Property Public Property Quantity() As Integer Get Return mintQuantity End Get Set mintQuantity = Value End Set End Property Public Function Amount() As Single Return mintQuantity * msngPrice End Function End Class,6.4 类的继承,2.阻止继承 当需要创建一个类,这个子类不能被继承,此时需要阻止继承。为了做到这一点,可以在类的声明中使用NotInheritable关键字来阻止继承。 Public NotInheritable Class ProductLine End Class 当使用了NotInheritable这个关键字,则其它代码都不能使用Inherits关键字来创建一个由这个类继承而来的子类。,6.4 类的继承,3.继承和辖域 当我们通过继承来创建一个子类的时候,新类就可以从父类中得到了所有的Public(公共)和Friend(友)方法、属性和变量。如果你在父类中声明一个Private(私有

温馨提示

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

评论

0/150

提交评论