第 五章 visual basic.net 面向对象语言基础

49
第 第第 Visual Basic.NET 第第第第第第第第

Upload: aiko-perez

Post on 30-Dec-2015

343 views

Category:

Documents


13 download

DESCRIPTION

第 五章 Visual Basic.NET 面向对象语言基础. 本章学习目标. 了解面向对象程序设计方法的基本原理及主要特点 —— 抽象性、封装性、继承性、多态性。掌握类和对象的概念以及如何用类来解决具体问题并在类的基础上如何派生出新类,以及重载的概念和作用。. 本章学习要点. Visual Basic.NET 语言的新特性和变化。 封装、继承、多态性的概念和使用方法。 类和对象的概念、定义方法及对象的构造。 继承和重载的概念及应用。 接口的概念及用法。. 5 .1 面向对象的思想. - PowerPoint PPT Presentation

TRANSCRIPT

第 五章 Visual Basic.NET 面向对象语言基础

本章学习目标

了解面向对象程序设计方法的基本原理及主要特点——抽象性、封装性、继承性、多态性。掌握类和对象的概念以及如何用类来解决具体问题并在类的基础上如何派生出新类,以及重载的概念和作用。

本章学习要点 Visual Basic.NET 语言的新特性和变化。 封装、继承、多态性的概念和使用方法。 类和对象的概念、定义方法及对象的构造。 继承和重载的概念及应用。 接口的概念及用法。

5 .1 面向对象的思想 面向对象的方法将数据与对数据的操作方法放在

一起,作为一个相互依存、不可分离的整体——对象。对同类型对象抽象出共性,形成类。类的大多数数据,只能用本类的方法进行处理。类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。每个对象都有各自的内部属性和操作方法,整个程序由一系列相互作用的对象构成。

5 .2 面向对象程序设计的特点

面向对象的程序设计方法是一种系统化的程序设计方法,它允许抽象化、模块化的分层结构,具有多态性、继承性和封装性。

抽象性与封装性 继承性 多态性

5 .2.1 抽象性与封装性 面向对象方法中的抽象是指对具体问题进行概括,抽出一类对象的公共性质并加以描述的过程。抽象的过程,就是对问题进行分析和认识的过程。

5 .2.2 继承性

交通工具

飞机 汽车 火车

轿车 工具车

继承性是指一个新类可以从已有类派生,这个过程称类的继承。新类继承了已有类的特征,称原来类的派生类,也叫做子类,已有类叫做基类或父类。

5 .2.3 多态性

多态性是指一般类中定义的属性或行为,被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为。多态性支持“同一接口,多种方法”,使高层代码只能写一次而在低层可多次复用。

例如,“调制解调器”类是“电话”类的派生类。“电话”类可以有“拨号”方法,“调制解调器”类也可以有“拨号”方法。但该方法的实现方式可以完全不同。

5 .3 类和对象

将数据及对数据的操作法封装在一起,作为一

个相互依存,不可分离的整体——对象。 对同类型对象抽象出其共性形成类。

对象■ 客观世界中的:是现实世界中的一个实际 存在 的

事物(如:人、车、一项计划)。 特点:有静态特性 有动态特性(例:学生)■ 计算机中的:是系统中用来描述客观事物的一个

实体,它是用来构成系统的一个基本单位。对象由一组属性和一组行为构成。

属性:描述对象静态特征的数据项。 行为:描述对象动态特征的数据项。

类■ 类:具有相同属性和行为的一组对象的集合。 为属于该类的全部对象提供了抽象的描 述,包括属性和行为两个部分。 类与对象的关系 : 集合——成员 抽象描述 ——具体实例

5 .3.1 属性 Visual Basic.NET 的对象都有许多属性,它们是用来描

述和反映对象特征的参数,对象中的数据就保存在属性中。

属 性 说 明Name 按钮的名称Left 按钮与容器左边缘之间的距离Height 按钮的高度text 按钮的标题Appearance 按钮是否以立体效果显示

按钮的常用属性

5 .3.2 方法 对象的属性实际上是对象的数据,而对象本

身就是对这些数据及其操作进行封装的结果,对象本身包含的函数或过程叫做方法。

        列表框的常用方法 方法 功能

Add 在列表框中添加列表项

Insert 在列表框中插入列表项

Remove 删除列表框中的指定列表项

Clear 清空列表框

对象调用方法的语法格式为:  对象名 . 方法 [ 参数 ]

例如: 列表框名 .clear

列表框名 .Items.Add(“ 新的表项名” )

5 .3.3 事件及事件过程 对于对象而言,事件就是发生在该对象上的

消息。可以把事件看做是一个响应对象行为的动作。

文本框的常用事件

事 件 说 明Keypress 按键盘上带有 Ascii 的键时触发Lostfocus 文本框失去焦点时触发Gotfocus 文本框得到焦点时触发TextChanged 文本框的内容变化时触发

5 .4 面向对象编程的实现 Visual Basic.NET 是一种真正意义上的面向对

象语言,它将编程人员带入了一个全新的编程方式中,即真正的面向对象编程技术,它是一种用对象分析、设计并编写应用程序的方法。

5 .4.1 类的创建

要实现面向对象的编程,必须首先定义类。在 Visual Basic.NET 中,使用 Class 语句定义一个类,同时定义这个类的属性、事件和方法等。

项目中增加空类的方法: 在 VB.NET 中增加一个类,需要先创建一个新的 Win

dows 应用程序项目,步骤如下:(1)打开 VB.NET 集成开发环境,出现起始页。(2)单击“新建项目”,打开新的项目窗口,选择“ VB 项

目”类型,“空项目”模板,输入项目名称,然后确定。(3)选择“项目” |“添加类”菜单命令,弹出“添加新项”

对话框,在“模板”中选择“类”,在“名称”框中输入类的名称“ ClassName” ,单击“打开”按钮,出现一个空类。

项目中添加了一个新文件,它包含了以下代码:     Public Class Class_Name

     End Class

1 、 Class 关键字

   在 .vb 文件中可以包含多个类、模块以及其他代码。在 VB.NET 中创建类的时候,只要在 Class 和 End Class 之间就可以添加与该类有关的代码。

Public Class Class_Name

End Class

2 、用 Property 语句创建属性

Property 语句的格式为: Property 属性名( [ 参数表 ] ) [As 类型名 1] Get < 语句块 > End Get Set ( ByVal Value As 类型名) < 语句块 > End Set End Property

  类的属性描述了对象的具体特征。在 Visual Basic.NET 中,类中的属性需要用 Property 语句来创建,属性可以有返回值,也可以赋值,所以,创建属性的关键在于如何实现返回值和赋值,由 Get 语句和 Set 语句实现。

Public class myclass Public x As Integer Private y As Integer = 0 Public Property y() As Integer Get Return y End Get Set(ByVal value As Integer) If value <= 50 Then y = value End Set End PropertyEnd Class

创建属性的例题:

3 、创建方法   在 VB.NET 中,类中方法的创建是使用 Sub 和 Function 关键字:

   Sub mywork( )   ……   End Sub

   Function myage( ) as integer  ……   End Function

    Sub 和 Function 的区别是,用 Sub 来创建一个方法它不返回数值;若是用 Function 来创建一个方法,它将返回一个数值作为结果。

作用域关键字包括以下几个: Private:私有属性,表明只能调用类中的代

码。 Friend:友元属性,表明可以在项目 /控件

中调用代码。 Public: 公共属性,表明可以在类外部调用

代码。 Protected: 保护属性,表明改类的派生类可

调用代码。

【例5 -1】 建立一个“学生”类,代码如下: Public Class student Dim score As Decimal = 85 Public Sub show() System.Console.WriteLine(" 学生成绩为: " & scor

e) End Sub End Class Public Class test Shared Sub main() Dim student1 As student student1 = New student student1.show() End Sub End Class

5 .4.2 对象的声明和取消   在面向对象的编程中,实际操作的是类中的具体实例

——对象,类只是一个模板。因此创建一个对象的过程又被称为实例化。

   定义好类以后可以通过 New 关键字创建类的实例,即类的对象。

1. NEW 语句    Visual Basic.NET 使用 NEW 语句创建对象,程序员

可以在任何地方使用 NEW 代码。例如:创建一个 myclass 类型的对象,代码如下:

Dim theclass as myclassTheclass=new myclass上面的语句可以简化为下面的语句:Dim theclass as new myclass

2.取消对象   要销毁一个对象,也就是释放与这个对象有关的资源,

只需要给该对象变量赋值 Nothing即可。代码如下:

Dim theclass as myclass

Theclass=new myclass ‘ 在此对象实例化和初始化Theclass=nothing ‘销毁 theclass 对象

【例5 -2】定义一个 clock(时钟 ) 类。通过这个类我们可以知道时钟的一些信息:时钟由时、分、秒三个整数来实现。所有这些都是时钟对象的属性,是对象性质的信息描述。另外,时钟还有显示时间等行为,这就是对它的方法,例如: ShowTime(显示时间)。

Public Class clock Private h As Integer Private m As Integer Private s As Integer Public Property hours() As Integer Get Return h End Get Set(ByVal value As Integer) h = value End Set End Property Public Property minutes() As Intege

r Get Return m End Get Set(ByVal value As Integer) m = value End Set End Property

Module Module1 Sub main() Dim time1 As New clock() time1.hours = 10 time1.minutes = 28 time1.seconds = 59 time1.ShowTime() End SubEnd Module

Public Property seconds() As Integer Get Return s End Get Set(ByVal value As Integer) s = value End Set End Property Public Sub ShowTime() Console.WriteLine(" 设置时间为 " & hours & " : " & minutes & " : " & seconds) End SubEnd Class

5 .4.3  对象的生命周期     VB.NET 中的对象有生存周期。定义一个对象的生存周期只需要一个 New 事件,这个 New 事件是在对象中其他代码之前运行的,并且在对象被创建时被调用。

   在 VB.NET 中,类似普通变量的初始化,类实例化时也可以初始化,称为对象的初始化,即给它的数据成员赋初值。对象初始化时,由一个特殊的成员函数完成,这个函数称为构造函数。对象的构造函数是在创建一个类的新实例的时候被调用的,程序中不能执行直接调用。构造函数的名称只能用 New, 并且不能指定函数类型,构造函数可以重载 ,即可以定义参数个数不同或参数类型不同的多个构造函数。

构造函数的格式如下:Public Sub New( ……)

End Sub

   若类中没有定义任何形式的构造函数,系统会自动生成默认的构造函数,即空构造函数。如下:

Public Sub New( )

End Sub

1 、对象的构造   对象构造是在使用 New 关键字创建类的新实例

对象时被触发的。     Public class theclass      Public sub new()      ‘在这里初始化对象      End sub    End class   利用这种类型的构造函数,就可以创建类的一

个实例对象:    Dim obj as new theclass()

  可以采用两种方式实现构造函数:一是通过使用 optional 关键字来声明一个可选参数,二是通过重载 new 方法 .

(1)使用 optional 关键字,只需把参数声明为可选即可,形式如下:Public sub new(optional byval id as integer=-1)If id=-1 then‘在这里初始化对象Else‘用 id值来初始化对象End ifEnd sub(2)使用一个 new 方法,通过重载来实现的,形式如下:Public overloads sub new‘在这里初始化对象End subPublic overloads sub new(byval id as integer)‘用 id值初始化对象End sub

Public Class clock Private h As Integer Private m As Integer Private s As Integer Public Sub New() h = 12 m = 12 s = 12 End Sub Public Sub New(ByVal h1 As Integer, ByVal m1 As Integer, ByVal s1 As I

nteger) h = h1 m = m1 s = s1 End Sub Public Sub ShowTime() Debug.WriteLine(" 设置时间为 " & h & " : " & m & " : " & s) End Sub End Class

Module Module1 Sub main() Dim time1 As New clock() time1.ShowTime() Dim time2 As New clock(10, 28, 59) time2.ShowTime() End Sub

2 、对象的中止 VB.NET 是使用一个名为“垃圾收集”机制

来中止对象的。 垃圾收集的主要优点是它避免了由引用计数带来的循环引用问题。如果两个对象相互引用,且每个对象都没有任何其他引用它们的代码,垃圾收集程序会发现它们并将它们中止。还有对象的中止处理过程是在应用程序空闲时执行的,减少了对用户的影响。

5 .4.4 共享类成员 1 、共享方法 2 、共享数据 3 、全局变量

1 、共享方法   在 VB.NET 中,一个类不仅可以拥有所有正常

的方法和属性,而且还可以拥有一些不需要创建类的实例的方法,这些方法就是共享方法。

Public Class Math Shared Function Add(ByVal a As Integer, ByVal b

As Integer) As Integer Return a + b End FunctionEnd Class可以不用实例化一个 Math 对象就可以访问,代码如下Dim result As Integerresult = Math.Add (5,10)

共享方法不仅可以通过常用的方法来访问,而且可以在不需要创建一个对象的条件下提供访问的功能。实际上,当一个共享方法被调用的时候,没有任何对象被创建,它就像在模块中的一个程序,可以被直接调用。

共享方法和其他常用的方法一样,也可以被重载,所以可以利用相同的共享方法来创建一系列变化的方法,每一种方法有不同的参数列表。

2 、共享数据   如果类的所有实例需要共享一个数值,或者

每个特定类型的对象要共享相同的变量,这些时候都可以通过使用共享变量来实现目的。共享变量可以使用 Shared 关键字来声明。

例如:Public class mycounter Private shared mintcount as integerEnd class注意:在默认状态下,共享方法的作用域是 public ,

共享变量的作用域是 private 。

例:Public class mycounter   Private shared mintcount as integer   Public sub new()    Mintcount+=1   End sub   Public readyonly property count() as integer    Get    Return mintcount   End get  End propertyEnd class

3 、全局变量   对于共享变量另外一个用法是提供全局变量的类型。给定一个 Public 作用域共享变量。

例:Public Class TheClass

Public Shared a As Integer

End Class

5 .5  类的继承    Visual Basic.NET 支持类的继承,允许用户定

义一个类,作为其他类继承的依据,继承类能够继承,扩充基本类的属性和方法,继承类也可以重载基本类的一些方法,所有在 Visual Basic.NET建立的类缺省的属性都是可继承的,其中已有类叫做基类(父类),继承的新类叫做派生类(子类)。

1 、实现基本的继承2 、禁止继承3 、基类成员在派生类中的作用域

1 、实现基本的继承【例 3-3】建立 person 类及它的派生类 employee 类。Public Class person Public sname, Iage, ssex Public Property name() As String Get Return sname End Get Set(ByVal value As String) sname = value End Set End Property Public Property age() As Integer Get Return Iage End Get Set(ByVal value As Integer) Iage = value End Set End Property

Public Property sex() As String Get Return ssex End Get Set(ByVal value As String) ssex = value End Set End PropertyEnd Class

Public Class employee Inherits person Dim Ssalary As Single Public Property salary() As Single Get Return Ssalary End Get Set(ByVal value As Single) Ssalary = value End Set End Property Sub Displayemployee() Debug.WriteLine("雇员的姓名: " & name) Debug.WriteLine("雇员的性别: " & sex) Debug.WriteLine("雇员的年龄: " & age) Debug.WriteLine("雇员的薪水: " & salary) End SubEnd Class

Module Module1 Sub Main() Dim aemployee As New employee() aemployee.name = "王强 " aemployee.sex = "男 " aemployee.age = 25 aemployee.salary = 3600.0 aemployee.Displayemployee() End SubEnd Module

2 、禁止继承

   在默认状态下,创建的任何类都是可以用作基类,可由这个基类创建其他的类。但有时需要创建一个不被继承的类,这时可以在类的声明中使用 NotInheritable 关键字。

Public NotInheritable Class Class_name

End Class

3 、基类成员在派生类中的作用域

   通过继承性创建子类时,新类将从父类获得所有 Public 和 Friend 方法、属性及变量。但在父类中声明的 Private 的任何内容都不能直接应用于新子类的代码中。

Public Class employee Inherits person Dim Ssalary As Single Public Property salary() As Single Get Return Ssalary End Get Set(ByVal value As Single) Ssalary = value End Set End PropertySub setperson(ByVal n As String, ByVal a As Integer, ByVal s As String, ByVal c As Singl

e) name = n age = a sex = s salary = c End Sub Sub Displayemployee() Debug.WriteLine("雇员的姓名: " & name) Debug.WriteLine("雇员的性别: " & sex) Debug.WriteLine("雇员的年龄: " & age) Debug.WriteLine("雇员的薪水: " & salary) End SubEnd Class

Module Module1 Sub Main() Dim aemployee As New employee() aemployee.setperson("王强 ", 25, "男 ", 3600.0) aemployee.Displayemployee() End SubEnd Module

5 .6  重载

    VB.NET 具有重载方法的功能,可以利用重载来实现多态性。重载是可以在一个类中可多次声明相同名称的一种方法,只要每个声明都有不同的参数列表即可。其中参数列表不同指的是参数的数据类型不同或参数的个数不同。

Public Class sum Public Function add(ByVal a As Integer, ByVal b As Integer) As Integer Return a + b End Function Public Function add(ByVal a As Double, ByVal b As Double) As Double Return a + b End FunctionEnd ClassModule Module1 Sub main() Dim NO1, NO2 As New sum Debug.WriteLine(NO1.add(5, 6)) Debug.WriteLine(NO2.add(2.5, 3.6)) End SubEnd Module

5 .7 多继承——接口

   多继承由多个基类继承所以为编程带来一定的复杂性,但可以通过接口来解决此问题。和类一样接口也定义了一系列属性、方法和事件。但与类不同的是,接口并不提供实现,它们由类来实现,并从类中被定义为单独的实体。