几乎在 Visual Basic 中执行的所有操作都与对象关联。如果您第一次接触面向对象的编程,则下列术语和概念将帮助您入门。
类和对象
单词“类”和“对象”在面向对象的编程中使用得非常多,很容易将它们混淆。一般来说,“类”是一些内容的抽象表示形式,而“对象”是类所表示的内容的可用示例。共享类成员是此规则的一个例外,这种成员可在类的实例和声明为共享类类型的对象变量中使用。
字段、属性、方法和事件
类由字段、属性、方法和事件组成。字段和属性表示对象包含的信息。字段类似于变量,因为可以直接读取或设置它们。例如,如果有一个名为 Car 的对象,则可以在名为 Color 的字段中存储其颜色。
属性的检索和设置方法与字段类似,但是属性是使用 Property Get 和 Property Set 过程实现的,这些过程对如何设置或返回值提供更多的控制。在存储值和使用此值的过程之间的间接层帮助隔离数据,并使您得以在分配或检索值之前验证这些值。
方法表示对象可执行的操作。例如,Car 对象可以有 StartEngine、Drive 和 Stop 方法。通过向类中添加过程(Sub 例程或函数)来定义方法。
事件是对象从其他对象或应用程序接收的通知,或者是对象传输到其他对象或应用程序的通知。事件使对象得以在每当特定情况发生时执行操作。Car 类的一个事件示例是 Check_Engine 事件。因为 Microsoft Windows 是事件驱动的操作系统,所以事件可来自其他对象、应用程序或用户输入(如鼠标单击或按键)。
封装、继承和多态性
字段、属性、方法和事件只是面向对象编程全部内容的一半。真正的面向对象的编程需要对象支持三种特性:封装、继承和多态性。
“封装”意味着将一组相关属性、方法和其他成员视为一个单元或对象。对象可以控制更改属性和执行方法的方式。例如,对象在允许属性更改前可验证值。通过隐藏对象的实现细节(一种称为“数据隐藏”的做法),封装还使在以后对实现进行更改变得更容易。
“继承”描述基于现有类创建新类的能力。新类继承基类的所有属性、方法和事件,而且可用其他属性和方法自定义该新类。例如,可基于 Car 类创建名为 Truck 的新类。Truck 类从 Car 类继承 Color 属性,而且可有其他属性,如 FourWheelDrive。
“多态性”意味着可以有多个可互换使用的类,即使每个类以不同方式实现相同属性或方法。多态性是面向对象编程的精华,因为它允许使用同名的项,而不管此时在使用什么类型的对象。例如,假设给定基类 Car,多态性使程序员能够为任意数量的派生类定义不同的 StartEngine 方法。名为 DieselCar 的派生类的 StartEngine 方法可以与基类中同名的方法完全不同。其他过程或方法可用完全相同的方式使用派生类的 StartEngine 方法,不管此时使用什么类型的 Car 对象。
重载、重写和隐藏
可以使用字段和属性在对象中存储信息。虽然从客户端应用程序角度来看,字段和属性几乎无法区别,但在类中声明它们的方式不同。属性使用 Property 过程控制如何设置或返回值,而字段只是类所公开的公共变量。
向类添加字段
在类定义中声明一个公共变量,如下面的代码所示:
Class ThisClass
Public ThisField As String
End Class
向类添加属性
在类中声明一个局部变量来存储属性值。因为属性不会自行分配任何存储区,所以该步骤是必需的。若要保护它们的值不被直接修改,用于存储属性值的变量应当声明为 Private。
根据需要以修饰符(如 Public 和 Shared)作为属性声明的开头。使用 Property 关键字声明属性名称,并声明属性存储和返回的数据类型。
在属性定义中定义 Get 和 Set 属性过程。Get 属性过程用于返回属性值,基本等效于语法中的函数。它们不接受参数,可用于返回在类中声明的、用于存储属性值的私有局部变量的值。Set 属性过程用于设置属性的值,它们有参数(通常称为 Value),该参数的数据类型与属性本身的数据类型相同。每当属性值更改时,Value 均会被传递给 Set 属性过程,在该过程中可以验证它并将其存储在一个局部变量中。
根据需要使用 End Get 和 End Set 语句终止 Get 和 Set 属性过程。
使用 End Property 语句终止属性块。
注意 如果正在 Visual Studio 集成开发环境 (IDE) 下工作,可以指示它去除空的 Get 和 Set 属性过程。键入 Property PropName As DataType(其中,PropName 是属性名称,DataType 是特定数据类型,如 Integer),相应的属性过程将出现在代码编辑器中。
下面的示例在类中声明一个属性:
Class ThisClass
Private m_PropVal As String
Public Property One() As String
Get
Return m_PropVal ' Return the value stored in the local variable.
' Optionally, you can use the syntax One = PropVal to return
' the property value.
End Get
Set(ByVal Value As String)
m_PropVal = Value ' Store the value in a local variable.
End Set
End Property
End Class
当创建 ThisClass 的一个实例并设置 One 属性的值时,将调用 Set 属性过程且该值在 Value 参数中传递,该参数存储在名为 m_PropVal 的局部变量中。当检索此属性值时,将像函数那样调用 Get 属性过程并返回存储在局部变量 m_PropVal 中的值。
属性和属性过程
可以使用属性和字段在对象中存储信息。属性使用属性过程控制如何设置或返回值,而字段只是公共变量。属性过程是在属性定义中声明的代码块,使您可以在设置或检索属性值时执行代码。Visual Basic .NET 有两种类型的属性过程:Get 属性过程用于检索属性值;Set 属性过程用于向属性赋值。例如,存储银行帐户余额的属性可能会在 Get 属性过程中使用代码以在返回可用余额之前记入利息并检查服务费。用于可用余额的 Set 属性过程会提供验证代码以防止不正确地更新余额。简而言之,属性过程允许对象保护和验证自己的数据
只读和只写属性
大多数属性有 Get 和 Set 这两个属性过程以使您可以同时读取和修改所存储的值。然而,您可以使用 ReadOnly 或 WriteOnly 修饰符来限制对属性的读取或修改。只读属性不能有 Set 属性过程,它们可用于需要公开但不允许修改的项。例如,可以使用只读属性来提供计算机处理器的速度。只写属性不能有 Get 属性过程,它们可用于需要存储但不对其他对象公开的数据。例如,只写属性可以用于存储密码。
注意 在将对象分配给属性时,Visual Basic 的早期版本支持使用 Let 属性过程。Visual Basic .NET 消除了对 Let 属性过程的需要,因为可以像处理其他任何种类的分配那样处理对象分配。
属性过程与字段
属性与字段都可在对象中存储和检索信息。它们的相似性使得在给定情况下很难确定哪个是更好的编程选择。
在以下情况下使用属性过程:
需要控制设置或检索值的时间和方式时。
属性有定义完善的一组值需要进行验证时。
设置值会导致对象状态中发生某些可察觉更改(如一个