-
vb.net教程之vb.net的面向对象性
vb.net的面向对象性
在vb的早期版本(1.0-3.0)并没有包括面向对象的功能,从Vb 4.0开始,用户可以象建立一个新的窗体一样建立一个新的类,并把它作为一个新的对象.但还只能称是半面向对象的编程语言。而Vb.net是真正意义上的完全面向对象的编程语言。本文将从Vb开始一直到Vb.net,介绍面向对象的一些基础知识。
Visual Basic中处理的任何事物几乎都和对象有关系,如果您对面向对象编程没有认识,则需要建立以下一些概念。
对象是一些把属性(Properties)、字段(fileds)、方法(methods)和事件(event)作为一个单独的数据类型进行处理的实体。对象可以使用户只需首先声明一些变量和方法以后,在感觉需要使用的时候,调用一个它的对象进行重用就可以了。
例如想保存一辆汽车的信息,就可以通过定义一些变量来描述一辆车的颜色和马力,但问题是,这个变量只是描述这一辆汽车的参数,如果又要描述另一辆汽车的参数的话,则又要定义一些其他变量来存储这些信息。如果使用类,就可以解决这个问题,只需要定义一个通用的汽车的类,每当需要描述一辆汽车的时候只需定义一个对象就可以了,这样就达到了代码重用的目的。
类描述了对象的字段、属性、方法以及对象的事件,对象是类的一个实例。在定义了一个类后,可以在需要的时候定义很多对象。
1.字段,属性,方法和事件
类是由属性,字段,方法和事件组成的,字段就是一个对象含有的片断的信息。用户可以象使用变量一样使用属性来存储一些信息。例如,一个对象名叫“Car”,其中有一个字段名为“Color”,下面的代码就是显示怎样改变“Color”字段的值的:
Car.Color="Blue"
属性的检索和设置与字段相似,但是它们在类中是以"Property Get"和"Property Set"过程来定义的。
方法表示了类可以做的一些事情,例如Car对象可以有StartEngine,Drive和Stop方法。
事件是表示一个对象从外部得到的信息的一个标示,事件允许对象任何时候在事件调用的时候做出相应的动作。例如,类Car的一个事件可以是Check_Engine。因为微软的Windows是一个事件驱动的系统,所以事件可能会来自于任何一个地方。比如,用户点击键盘或鼠标时,就是触发了一个事件。当然,一些事件的触发可能来自于其他的对象。
2.封装,继承和多态
属性,方法和事件只是面向对象编程的部分概念,真正的面向对象编程需要对象满足和支持下面三个特性:封装性,继承性和多态性。
封装性表示一个对象的属性和方法。对外界而言,是不能直接访问的。而对象本身对于属性和方法具有绝对的控制,比如一个对象可以在属性允许变化之前确认一下变量的值。
继承性表示可以在一个类的基础上建立一个新类。派生类,也就是继承类,可以具有基本类的所有属性、方法和事件,并且可以加上一些其他的属性和方法,例如可以根据基本类Car建立一个新类SUV。SUv类可以从Car类中继承Color属性,而且还可以加上一些其他的属性例如:FourWheelDrive。
多态性是指一些不同的类可以建立一个具有相同名称的属性或者方法。多态性对于面向对象编程是非常重要的,因为它可以使用户不论在什么时候,也不论用户正在处理什么对象,都可以调用这个具有共同名称的方法。例如有一个基本类Car,多态性可以允许它的派生类具有不同定义的StartEngine方法,派生类DieselCar的StartEngine方法可能和基本类的StartEngine方法完全不一样,但是也可以调用的。当然,其他的方法或者属性也可以这样处理。
类是面向对象的基础。类和Type数据结构的区别在于,Type数据结构只有数据成员,而类的成员包括数据成员、属性和方法。类就是一个没有图形界面的ActiveX控件,用户可以使用它,但不能看到它。在vb.net以前的版本中,类不能继承,但在.Net版本中,实现了类的继承。用户可以通过以下的描述来比较类和Type数据结构的区别。
Structures是一个把一些相关的数据归类的强有力的工具,如:一个用户定义的一个名为udtAccount的数据类型:
Public Type udtAccount
Number As Long
Type As Byte
CustomerName AS String
Balance As Double
End Type
用户可以申明一个udtAccount类型的一个实例,然后设置里面字段的值,把整个记录打印出来,把存到数据库中等操作。
虽然Structures类型设置的功能很强大,但是在代码中,Structures可能会带来一些问题。用户可能建立一个Withdrawal过程,但在Withdrawal超过了它的平衡点的时候会产生错误,而且也没有办法阻止程序的其他地方改变Balance字段。
换一句话说,操作过程和Structures的联系靠的只是一些规定、人为的记忆以及程序员对代码维护知识的了解。
而面向对象编程就可以解决这个问题,它把数据和操作过程结合在一起,并且组成一个独立的实体。用户定义Account为一个类来代替udtAccount Structure时,这些数据都变成了私有遥,而且那些访问这些数据的操作过程也被定义为这个类的一部分,成为了这个类的属性和方法,这就是所谓的封装性,也就是说一个对象就是一个包含数据和操作的单元。
当用户通过一个类建立一个Account对象时,就可以避免这种错误,用户只能通过这个对象的属性才能访问它的一些数据字段,下面的代码片断显示了Account类中的过程怎样支持封装性:
'The account balance is hidden from outside code.
Private mdblBalance As Double
'The read-only Balance property allows outside code
'to find out the account balance
Public Property Get Balance() As Double
Balance=mdblBalance
End Properyt
'The Withdrawal method Changes the account balance
'but only if an overdraft error doesn't occur
Public Sub Withdrawal(ByVal Amount As Double)
If Amount>Balance Then
Err.Raise Number=VBObjectError+2081._
Description:="Overdraft"
End If
mdblBalance=mdblBalance-Amount
End Sub
用户并不需要担心如何使用类中的操作过程,也不必担心属性、过程、私有变量的一此语法,最重要的就是记住,用户可以定义一个类来封装自己的数据和操作方法。
用户也不必要担心是否使用权了正确的对Account的操作,因为这些操作现在也被包含在对象之中了。
类在vb.net中是一个非常重要的部分,几乎所有正规的程序都包括了一个或者几个类,在vb.net中,类模块和窗体的区别已经不存在了,几乎所有的程序都是由类组成的,为了更好地使用这些类,它们被按照不同的功能分在不同的功能类库里。
除去这些表面现象,这些类库都是在独立的DLL动态库里,用户只需要用Imports说明就可以引用它们了,这样这些类里面的函数就可以用了,如:
Import System.Collections 'Use Collection namespace classes
逻辑上,每一个类库代表了一个独立的命名空间(namespace),当用户引用了一个命名空间后,编译器将可以找到这些命名空间所对应的类和方法。最常用的命名空间是"System"命名空间,它是一个缺省的引用,并不需要用户去申明它,其中包括了一些用户访问最基本的类和方法,如:Application,Arry,Console,Exception,Object以及一些基本的标准的对象,如:Byte,Boolean,Single,Double,String。在下面的最简单的控制台程序中,我们可以看一看关于System的引用:
Imports System
'Simple Vb Hello World program
Public Class cMain
shared sub Main() '表明启动函数是Main
'在控制台中写文本
Console.WriteLine("Hello Vb World")
End Sub
End Class
上面的程序只是在DOS窗体中写了一句文本"Hello Vb World",程序必须以Sub Main子例程开始启动,而且在类模块中,它必须声明为"shared",而在vb.net中这个程序则应该写成:
'simple Vb Hello World Program
Public Module cMain
Sub Main()
Console.WriteLine("Hello Vb World")
End Sub
End Module
在上面这两个例子中,除了在类模块中,Sub Main被声明为"Share"。读者可以看出它们是很相象的,在Vb.net中模块和早期的版本的vb中的模块的作用相似,在模块中声明的方法和常量在整个程序中都是公有的。
在vb的早期版本(1.0-3.0)并没有包括面向对象的功能,从Vb 4.0开始,用户可以象建立一个新的窗体一样建立一个新的类,并把它作为一个新的对象.但还只能称是半面向对象的编程语言。而Vb.net是真正意义上的完全面向对象的编程语言。本文将从Vb开始一直到Vb.net,介绍面向对象的一些基础知识。
Visual Basic中处理的任何事物几乎都和对象有关系,如果您对面向对象编程没有认识,则需要建立以下一些概念。
对象是一些把属性(Properties)、字段(fileds)、方法(methods)和事件(event)作为一个单独的数据类型进行处理的实体。对象可以使用户只需首先声明一些变量和方法以后,在感觉需要使用的时候,调用一个它的对象进行重用就可以了。
例如想保存一辆汽车的信息,就可以通过定义一些变量来描述一辆车的颜色和马力,但问题是,这个变量只是描述这一辆汽车的参数,如果又要描述另一辆汽车的参数的话,则又要定义一些其他变量来存储这些信息。如果使用类,就可以解决这个问题,只需要定义一个通用的汽车的类,每当需要描述一辆汽车的时候只需定义一个对象就可以了,这样就达到了代码重用的目的。
类描述了对象的字段、属性、方法以及对象的事件,对象是类的一个实例。在定义了一个类后,可以在需要的时候定义很多对象。
1.字段,属性,方法和事件
类是由属性,字段,方法和事件组成的,字段就是一个对象含有的片断的信息。用户可以象使用变量一样使用属性来存储一些信息。例如,一个对象名叫“Car”,其中有一个字段名为“Color”,下面的代码就是显示怎样改变“Color”字段的值的:
Car.Color="Blue"
属性的检索和设置与字段相似,但是它们在类中是以"Property Get"和"Property Set"过程来定义的。
方法表示了类可以做的一些事情,例如Car对象可以有StartEngine,Drive和Stop方法。
事件是表示一个对象从外部得到的信息的一个标示,事件允许对象任何时候在事件调用的时候做出相应的动作。例如,类Car的一个事件可以是Check_Engine。因为微软的Windows是一个事件驱动的系统,所以事件可能会来自于任何一个地方。比如,用户点击键盘或鼠标时,就是触发了一个事件。当然,一些事件的触发可能来自于其他的对象。
2.封装,继承和多态
属性,方法和事件只是面向对象编程的部分概念,真正的面向对象编程需要对象满足和支持下面三个特性:封装性,继承性和多态性。
封装性表示一个对象的属性和方法。对外界而言,是不能直接访问的。而对象本身对于属性和方法具有绝对的控制,比如一个对象可以在属性允许变化之前确认一下变量的值。
继承性表示可以在一个类的基础上建立一个新类。派生类,也就是继承类,可以具有基本类的所有属性、方法和事件,并且可以加上一些其他的属性和方法,例如可以根据基本类Car建立一个新类SUV。SUv类可以从Car类中继承Color属性,而且还可以加上一些其他的属性例如:FourWheelDrive。
多态性是指一些不同的类可以建立一个具有相同名称的属性或者方法。多态性对于面向对象编程是非常重要的,因为它可以使用户不论在什么时候,也不论用户正在处理什么对象,都可以调用这个具有共同名称的方法。例如有一个基本类Car,多态性可以允许它的派生类具有不同定义的StartEngine方法,派生类DieselCar的StartEngine方法可能和基本类的StartEngine方法完全不一样,但是也可以调用的。当然,其他的方法或者属性也可以这样处理。
类是面向对象的基础。类和Type数据结构的区别在于,Type数据结构只有数据成员,而类的成员包括数据成员、属性和方法。类就是一个没有图形界面的ActiveX控件,用户可以使用它,但不能看到它。在vb.net以前的版本中,类不能继承,但在.Net版本中,实现了类的继承。用户可以通过以下的描述来比较类和Type数据结构的区别。
Structures是一个把一些相关的数据归类的强有力的工具,如:一个用户定义的一个名为udtAccount的数据类型:
Public Type udtAccount
Number As Long
Type As Byte
CustomerName AS String
Balance As Double
End Type
用户可以申明一个udtAccount类型的一个实例,然后设置里面字段的值,把整个记录打印出来,把存到数据库中等操作。
虽然Structures类型设置的功能很强大,但是在代码中,Structures可能会带来一些问题。用户可能建立一个Withdrawal过程,但在Withdrawal超过了它的平衡点的时候会产生错误,而且也没有办法阻止程序的其他地方改变Balance字段。
换一句话说,操作过程和Structures的联系靠的只是一些规定、人为的记忆以及程序员对代码维护知识的了解。
而面向对象编程就可以解决这个问题,它把数据和操作过程结合在一起,并且组成一个独立的实体。用户定义Account为一个类来代替udtAccount Structure时,这些数据都变成了私有遥,而且那些访问这些数据的操作过程也被定义为这个类的一部分,成为了这个类的属性和方法,这就是所谓的封装性,也就是说一个对象就是一个包含数据和操作的单元。
当用户通过一个类建立一个Account对象时,就可以避免这种错误,用户只能通过这个对象的属性才能访问它的一些数据字段,下面的代码片断显示了Account类中的过程怎样支持封装性:
'The account balance is hidden from outside code.
Private mdblBalance As Double
'The read-only Balance property allows outside code
'to find out the account balance
Public Property Get Balance() As Double
Balance=mdblBalance
End Properyt
'The Withdrawal method Changes the account balance
'but only if an overdraft error doesn't occur
Public Sub Withdrawal(ByVal Amount As Double)
If Amount>Balance Then
Err.Raise Number=VBObjectError+2081._
Description:="Overdraft"
End If
mdblBalance=mdblBalance-Amount
End Sub
用户并不需要担心如何使用类中的操作过程,也不必担心属性、过程、私有变量的一此语法,最重要的就是记住,用户可以定义一个类来封装自己的数据和操作方法。
用户也不必要担心是否使用权了正确的对Account的操作,因为这些操作现在也被包含在对象之中了。
类在vb.net中是一个非常重要的部分,几乎所有正规的程序都包括了一个或者几个类,在vb.net中,类模块和窗体的区别已经不存在了,几乎所有的程序都是由类组成的,为了更好地使用这些类,它们被按照不同的功能分在不同的功能类库里。
除去这些表面现象,这些类库都是在独立的DLL动态库里,用户只需要用Imports说明就可以引用它们了,这样这些类里面的函数就可以用了,如:
Import System.Collections 'Use Collection namespace classes
逻辑上,每一个类库代表了一个独立的命名空间(namespace),当用户引用了一个命名空间后,编译器将可以找到这些命名空间所对应的类和方法。最常用的命名空间是"System"命名空间,它是一个缺省的引用,并不需要用户去申明它,其中包括了一些用户访问最基本的类和方法,如:Application,Arry,Console,Exception,Object以及一些基本的标准的对象,如:Byte,Boolean,Single,Double,String。在下面的最简单的控制台程序中,我们可以看一看关于System的引用:
Imports System
'Simple Vb Hello World program
Public Class cMain
shared sub Main() '表明启动函数是Main
'在控制台中写文本
Console.WriteLine("Hello Vb World")
End Sub
End Class
上面的程序只是在DOS窗体中写了一句文本"Hello Vb World",程序必须以Sub Main子例程开始启动,而且在类模块中,它必须声明为"shared",而在vb.net中这个程序则应该写成:
'simple Vb Hello World Program
Public Module cMain
Sub Main()
Console.WriteLine("Hello Vb World")
End Sub
End Module
在上面这两个例子中,除了在类模块中,Sub Main被声明为"Share"。读者可以看出它们是很相象的,在Vb.net中模块和早期的版本的vb中的模块的作用相似,在模块中声明的方法和常量在整个程序中都是公有的。
栏目列表
最新更新
python爬虫及其可视化
使用python爬取豆瓣电影短评评论内容
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比