类:对象的蓝图
更新:2007 年 11 月
类是对象的符号表示形式。与蓝图描述构成建筑的项一样,类以同样的方式描述组成对象的属性、字段、方法和事件。就像一副蓝图可以用于建成多座建筑一样,一个类也可以用于根据需要创建多个对象。就像蓝图定义使用建筑的人可以访问建筑的哪些部分一样,类也可以通过封装来控制用户对对象项的访问。
类和对象
“类”和“对象”这两个术语有时互换使用,但实际上,类描述对象的“结构”,而对象是类的可用“实例”。每个实例都是其类的一个精确而又不同的副本。由于对象是类的实例,所以创建对象的操作称为“实例化”。
如果使用蓝图类比,类是蓝图,对象就是基于该蓝图的建筑。通常情况下,更改一个对象中的数据不会更改任何其他对象中的数据。(“共享成员”(即用 Shared 修饰符声明的类成员)例外,它们独立于类的特定实例存在。)
封装
“封装”是包含和控制对一组关联项的访问的能力。类提供一个最通用的方式来封装项。在下面的示例中,BankAccount 类封装描述银行帐户的方法、字段和属性。
如果没有封装,您就要声明单独的过程和变量来存储和管理银行帐户信息,并且要一次处理多个银行帐户就会比较困难。通过封装,您可以将 BankAccount 类中的数据和过程作为一个单元来使用。您可以同时处理多个银行帐户而不会混淆,因为每个帐户都由该类的一个唯一实例来表示。
封装还使您可以控制如何使用数据和过程。可以使用访问修饰符(如 Private 或 Protected)来防止外部过程执行类方法或读取和修改属性和字段中的数据。您应该将类的内部详细信息声明为 Private 以防止它们在类的外部使用;这种技术被称为“数据隐藏”,是对帐户余额等客户信息的保护方式。
封装的一个基本规则是只能通过 Property 过程或方法来修改或检索类数据。隐藏类的实现详细信息可以防止这些类被以不希望的方式使用,并使您在以后修改这类项时没有兼容性问题方面的风险。例如,BankAccount 类的更高版本可以更改 AccountBalance 字段的数据类型,而不会破坏依赖于此字段拥有特定数据类型的其他应用程序。
继承
同 Visual Basic 结构一样,您可以使用类定义封装一组相关项的数据类型。但是,与结构不同的是,Visual Basic 类可以继承和扩展其他类的特性。作为新类的基础的类称为“基类”。从基类派生的类称为“派生类”。派生类继承基类的所有字段、属性、方法和事件。这就意味着可以开发和调试类一次,然后将其作为其他类的基础重复使用。
下面的示例定义一个表示一般银行帐户的基类以及一个特定类,后者继承该基类的属性,但被自定义为描述一个支票帐户。
Class BankAccount
Private AccountNumber As String
Private AccountBalance As Decimal
Private HoldOnAccount As Boolean = False
Public Sub PostInterest()
' Add code to calculate the interest for this account.
End Sub
ReadOnly Property Balance() As Decimal
Get
' Return the available balance.
Return AccountBalance
End Get
End Property
End Class
Class CheckingAccount
Inherits BankAccount
Sub ProcessCheck()
' Add code to process a check drawn on this account.
End Sub
End Class
有关继承的更多信息,请参见 继承的基础知识。
共享成员
默认情况下,类数据特定于类的每个实例,但有时可能需要在从一个类创建的所有对象间共享单个数据项。在这种情况下,使用 Shared 修饰符让变量在类的所有实例中共享同一值(在其他编程语言中,共享成员有时被称为“静态成员”)。可以不用先创建类的实例而直接使用类名调用共享方法。
有关共享成员的更多信息,请参见 Visual Basic 中的共享成员。
隐藏
派生类可以使用 Shadows 关键字来声明一个与继承成员同名的成员。已隐藏的成员不要求和正被隐藏的成员有相同的数据类型。例如,一个属性可以隐藏 Integer 类型的一个变量。
有关共享成员的更多信息,请参见 Visual Basic 中的隐藏。