面向对象编程(针对 Visual Basic 6.0 用户)

更新:2007 年 11 月

Visual Basic 6.0 支持面向对象的语言元素以及分布在库中的对象。Visual Basic 2008 通过支持其所有语言属性 (Property) 扩展了对面向对象编程的支持。

概念差异

以下各节列出了 Visual Basic 2008 具有的面向对象功能,并将这些功能与 Visual Basic 6.0 中的相应实现方式(如果有)进行了对比。对于每个功能,都提供了指向更深入的帮助页面的链接,帮助您了解更多信息。

访问级别

在 Visual Basic 6.0 中,使用 Private、Friend、Public 和 Static 关键字设置所声明元素的访问级别。

在 Visual Basic 2008 中,关键字 Private、Friend、Public 和 Static 以及新的关键字 Protected 和 Protected Friend 用于设置已声明元素的访问级别。已声明元素的访问级别是指能够对其进行访问的范围,即什么代码具有读取或写入它的权限。

有关更多信息,请参见 Visual Basic 中的访问级别Visual Basic 中的范围

属性 (Attribute)

在 Visual Basic 6.0 中,通过 Visual Basic IDE 中的诸如“过程属性”这样的工具提供了对嵌入属性 (Attribute) 的有限支持。

在 Visual Basic 2008 中,Attribute 是一个描述性标记,可以用于注明类型和类型成员语句,从而修改它们的含义或自定义它们的行为。例如,类语句和类方法语句可以利用属性 (Attribute) 进行注明。

您的应用程序和其他应用程序(例如 Visual Basic 编译器)可以使用反射来访问属性 (Attribute),确定应如何使用类型及类型成员。

属性 (Attribute) 可以用于通过 Visual Basic 执行“面向方面的编程”(AOP)。“方面”是程序中贯穿业务逻辑公共要素的“横截面”部分。换句话说,需要通过它来完成程序,但不必是特定于程序所针对的目标领域的。从业务逻辑中分离出像日志记录和持久性这样的方面是面向方面的编程模式的目标。

有关更多信息,请参见 Visual Basic 中的属性概述Visual Basic 中使用的属性特性的常见用途

二进制兼容性

在 Visual Basic 6.0 中,Binary Compatibility 选项允许在编译新版本时,自动保留来自组件先前版本的类和接口标识符。

在 Visual Basic 2008 中,不支持 Binary Compatibility 选项;而是利用属性 (Attribute) 实现二进制兼容性。这使您可直接控制位于已编译组件内的信息,例如,类和接口标识符、虚拟表偏移量和任何适当的 COM 属性 (Attribute)。

有关更多信息,请参见 二进制兼容性更改(针对 Visual Basic 6.0 用户)

类模块

在 Visual Basic 6.0 中,类在类模块中进行定义。每个类模块都存储在一个文件扩展名为 .cls 的特殊类型的文件中。

在 Visual Basic 2008 中,类在 Class 语句中定义,该语句指定类的名称和成员。Class 语句存储在源文件中。整个源文件可被视作一个纯文本文件。

多个 Class 语句以及其他类型语句可以存储在单个源文件中。Visual Basic 不要求源文件的名称与源文件中定义的 Class 或类型相匹配。

有关更多信息,请参见 Class 语句 (Visual Basic)

类的构造函数方法

在 Visual Basic 6.0 中,使用类中名为 Class_Initialize 的 Initialize 事件处理程序执行创建对象时需要执行的代码。

在 Visual Basic 2008 中,向类中添加一个或多个构造函数来执行代码和初始化变量。构造函数是类中名为 New 的一些方法。New 方法可以被重载,以在同一个类语句内使用 New 名称提供多个构造函数。

有关更多信息,请参见 New (Visual Basic)使用构造函数和析构函数

类的析构函数方法

在 Visual Basic 6.0 中,使用 Nothing 关键字取消对象变量与实际对象之间的关联。使用 Set 语句将 Nothing 赋给对象变量。

在 Visual Basic 2008 中,对于应用程序创建的大多数对象,可以依赖垃圾回收器自动执行必要的内存管理任务。但是,非托管资源需要显式清除。最常用的非托管资源类型是包装操作系统资源的对象,例如,文件句柄、窗口句柄或网络连接。

创建封装非托管资源的对象时,建议在公共 Dispose 方法中提供必要的代码以清理非托管资源。通过提供 Dispose 方法,可让对象的用户在使用完对象后显式释放其内存。

使用封装非托管资源的对象时,应该了解 Dispose 并在必要时调用它。

有关更多信息,请参见 清理非托管资源自动内存管理

Class_Initialize

在 Visual Basic 6.0 中,类的 Initialize 事件可以由 Class_Initialize 方法进行处理,以便执行在创建对象时需要执行的代码。例如,可以初始化类的数据变量的值。

在 Visual Basic 2008 中,不支持 Initialize 事件和 Class_Initialize 处理程序。为了对类进行初始化,可以向您定义的类和结构中添加一个或多个构造函数方法。

有关更多信息,请参见 Class_Initialize 更改(针对 Visual Basic 6.0 用户)

数据类

在 Visual Basic 6.0 中,可使用数据源和复杂数据使用者类处理外部数据,例如 Microsoft SQL Server 数据库。数据源类提供了来自外部源的数据。数据使用者类可以绑定到某个外部数据源,例如 Data Source 类。

在 Visual Basic 2008 中,使用数据源、简单数据使用者、复杂数据使用者以及绑定类处理外部和内部数据。

有关更多信息,请参见数据绑定和 Windows 窗体

默认属性 (Property)

在 Visual Basic 6.0 中,任何类属性都可定义为类的默认属性 (Property)。

在 Visual Basic 2008 中,类或结构的默认成员只能是带有一个或多个参数的属性 (Property)。通过在类或结构的属性声明语句中包括 Default 关键字,可定义默认属性 (Property) 成员。

有关更多信息,请参见 默认属性更改(针对 Visual Basic 6.0 用户)

委托

在 Visual Basic 6.0 中,不支持委托类型。

在 Visual Basic 2008 中,委托类型是面向对象方法指针的一种形式,允许通过引用方法来间接地调用该方法。委托可用于挂接事件处理程序,以及将方法从一个方法传递到另一个方法。

可以使用委托实现异步设计模式。例如,通过使用异步委托,程序可以调用一个对大型列表进行枚举的方法,同时让主程序继续执行。当枚举完成的时候,将进行回调,然后程序再对它进行处理。

有关更多信息,请参见 Visual Basic 中的委托如何:在 Visual Basic 中将过程传递给另一过程

错误处理

在 Visual Basic 6.0 中,使用 On Error 语句执行非结构化的异常处理。

在 Visual Basic 2008 中,支持非结构化和结构化异常处理。结构化异常处理是一种控制结构,其中包含异常、被隔离的代码块和用于创建异常处理机制的筛选器。

有关更多信息,请参见 Visual Basic 中的结构化异常处理选择何时使用结构化异常处理和非结构化异常处理

事件

在 Visual Basic 6.0 中,使用 Event、RaiseEvent 和 WithEvents 关键字来声明、引发和处理事件。

在 Visual Basic 2008 中,Event、RaiseEvent 和 WithEvents 关键字以及新增加的 AddHandler、RemoveHandler 和 Handles 关键字用于声明、引发和处理事件。

AddHandler 和 RemoveHandler 关键字允许您动态地添加、移除和更改与事件关联的事件处理程序。

可通过 Handles 关键字在方法上定义 Handles 子句。Handles 声明了过程将处理某个指定的事件。

.NET Framework 中的事件是基于委托模型的。委托模型基于面向对象的观察者设计模式。

有关更多信息,请参见 如何:编写事件处理程序

泛型

在 Visual Basic 6.0 中,不支持泛型类型。

在 Visual Basic 2008 中,可使用泛型在 Visual Basic 程序中实现参数化的多态性。泛型代码在编写时没有规定具体的类型,因此可以将其透明地用于任何数量的新类型。

Visual Basic 2008 支持在泛型类、结构、接口、过程和委托上使用类型参数。对应的类型变量在编译时指定泛型类型中某个元素的数据类型。

有关更多信息,请参见 Visual Basic 中的泛型类型

全局类

在 Visual Basic 6.0 中,类的 Instancing 属性 (Property) 的值决定了类是否为私有的——也就是说,是只能在一个组件中使用还是也可以用于其他应用程序。它也决定了其他应用程序创建类实例和调用类成员的方式。

在 Visual Basic 2008 中,不再支持 Instancing 属性 (Property)。

您可以在一个程序集的类语句中应用 Public 关键字,向其他程序集公开该程序集中的类。

您可以引用外部程序集,例如引用一个类库,这样程序中的代码就可以使用该类库中的 Public 类。

您可以使用 Imports 关键字从所引用的项目和程序集中导入命名空间名称。Imports 关键字还可以导入在包含此语句的文件所在的同一个项目中定义的命名空间名称。

您可以对类和结构的字段、属性 (Property) 和方法成员应用 Shared 关键字,以实现共享成员。共享成员是由一个类或结构的所有实例共享的属性 (Property)、过程和字段。类的共享成员可以在不初始化类的情况下进行访问。

有关更多信息,请参见 Visual Basic 中的访问级别引用和 Imports 语句Visual Basic 中的共享成员

实现继承

在 Visual Basic 6.0 中,不支持实现继承。

在 Visual Basic 2008 中,可以通过实现继承实现特定的多态性。这样,您便可以定义在运行时可由客户端代码互换使用的类,但是这些类在方法或属性 (Property) 的功能上存在差异(虽然名称相同)。

您可以定义充当派生类的基础的基类。派生类继承并可扩展基类的属性 (Property)、方法和事件。派生类还可以用新的实现重写继承的方法。

有关更多信息,请参见 继承的基础知识何时使用继承

接口继承

Visual Basic 6.0 通过多个 ActiveX 接口来提供多态性。在形成 ActiveX 规范的基础结构的组件对象模型 (COM) 中,多接口允许软件组件系统无需更改现有代码即可进行演变。

在 Visual Basic 2008 中,可以利用 .NET Framework 的 Interface 关键字实现特定的多态性。

多个类可以实现同一个 Interface,单个类也可以实现一个或多个接口。接口从本质上说是对类需要如何进行响应做出的定义。接口定义类需要实现的方法、属性 (Property) 和事件,以及每个成员需要接收和返回的参数的类型,但是如何具体实现这些成员则取决于实现它们的类。

多个接口具有允许软件组件的系统不断演变而无需更改现有代码的优点。

有关更多信息,请参见 基于接口的多态性如何:创建和实现接口

方法:ByVal 和 ByRef 参数

在 Visual Basic 6.0 中,可以按值或按引用向方法传递参数。除非使用 ByVal 或 ByRef 关键字显式指定方法参数,否则将按引用 (ByRef) 隐式传递变量。

在 Visual Basic 2008 中,参数通过值或引用传递给方法。除非使用 ByVal 或 ByRef 关键字显式指定方法参数,否则将按值 (ByVal) 隐式传递变量。

有关更多信息,请参见 通过值和通过引用传递参数

方法:重载

在 Visual Basic 6.0 中,不支持方法重载。

在 Visual Basic 2008 中,使用 Method 重载可在 Visual Basic 程序中实现特定的多态性。如果在类中定义了同一方法的多个版本,就表示重载了该方法。各个重载版本在参数和返回类型上有所不同。

有关更多信息,请参见 重载属性和方法Visual Basic 如何提供多态性

方法:重写

在 Visual Basic 6.0 中,不能重写方法。

在 Visual Basic 2008 中,可以使用 Overrides 关键字在派生类中重写方法,以提供与派生类的基类不同的方法实现。

有关更多信息,请参见 重写属性和方法

方法:返回结果

在 Visual Basic 6.0 中,使用 Function 方法的名称作为返回 Function 方法结果的变量的名称。

在 Visual Basic 2008 中,使用 Return 关键字返回 Function 方法的结果。

使用 Return 将控制权返回给调用 Sub、Function 或 Property 方法的代码。

有关更多信息,请参见 Return 语句 (Visual Basic)

My

在 Visual Basic 2008 中,新的 My 功能通过提供常用 .NET Framework 类和函数的入口点,使得可以使用 Visual Basic 进行快速的面向对象编程。My 提供了新的高级 .NET Framework 类,这些类将相关功能组合到了基于任务的 API 中。

有关更多信息,请参见 使用 My 开发

MyBase、MyClass 和 Me 关键字

在 Visual Basic 6.0 中,Me 关键字的行为类似一个隐式声明的变量。当类具有多个实例的时候,Me 为引用代码正在运行的类的特定实例提供了一条途径。

在 Visual Basic 2008 中,MyBase 关键字为引用当前类实例的基类提供了一条途径。

MyClass 关键字为引用当前类实例而无需重写提供了一条途径。

Me 关键字为引用代码正在运行的类或结构的特定实例提供了一条途径。

有关更多信息,请参见 Visual Basic 中的 Me、My、MyBase 和 MyClass

New 关键字

在 Visual Basic 6.0 中,如果不正确地使用 New 关键字,会导致一些异常的重新初始化行为,并会因此导致错误或过度占用内存。

在 Visual Basic 2008 中,New 关键字只是负责为对象分配空间;因此不会导致任何异常的重新初始化行为。

可以在声明语句或赋值语句中使用 New 子句。在执行该语句时,它会调用指定类的构造函数方法,并传递 New 子句提供的任何参数。这意味着可以从实例化对象时开始强制数据约束。

类可以有一个或多个构造函数。构造函数是方法中一些名为 New 的方法。可以通过重载 New 方法,可以在类中定义多个构造函数。经过重载的构造函数方法可称之为参数化的构造函数。

有关更多信息,请参见 New (Visual Basic)

对象生存期

在 Visual Basic 6.0 中,对象的生存期是确定性的;每个对象实例都维护一个引用计数。当释放对实例的最后一个引用时,计数等于 0,对象即会被终止。

在 Visual Basic 2008 中,对象的生存期是不确定的;不一定需要在释放最后一个引用后立即调用析构函数。这是由于公共语言运行库维护一个引用树,而非单个的引用计数。

内存回收器在后台跟踪引用树。如果它从当前的任何执行代码中找到没有任何引用的对象或对象组,则会调用所有这类对象的析构函数。

不可能预测该毁坏顺序或内存回收器跟踪引用树所花费的时间。

有关更多信息,请参见 Visual Basic 中的生存期对象生存期:如何创建和销毁对象

运算符重载

在 Visual Basic 6.0 中,不支持运算符重载。

在 Visual Basic 2008 中,可通过运算符重载为用户定义的类或结构定义标准运算符(如 *、<> 或 And)的行为。

有关更多信息,请参见 如何:定义转换运算符

Option Strict

在 Visual Basic 6.0 中,在运行时使用许可类型检查。

在 Visual Basic 2008 中,可以使用 OPTION STRICT ON 语句在设计时启用严格类型检查,而不是在运行时使用许可类型检查。默认情况下,使用 OPTION STRICT OFF。

在数据类型之间进行转换时,Visual Basic 编译器可以在严格类型语义或许可类型语义下操作。如果严格的类型语义生效 (OPTION STRICT ON),则只允许进行隐式扩大转换,而收缩转换必须是显式的。在许可类型语义下 (OPTION STRICT OFF),您可以尝试所有隐式扩大转换和隐式收缩转换。类型语义适用于所有数据类型(包括对象类型)之间的转换。

有关更多信息,请参见 Visual Basic 中的类型检查

属性 (Property) 语法

在 Visual Basic 6.0 中,使用 Property Get、Property Let 和 Property Set 语句获取和设置属性 (Property) 值。

在 Visual Basic 2008 中,使用统一的属性 (Property) 声明语法,其中包括获取和设置属性 (Property) 值的过程。这保证了属性 (Property) 属性 (Attribute) 的一致性,例如访问级别和重载。

有关更多信息,请参见 属性更改(针对 Visual Basic 6.0 用户)

公共接口

在 Visual Basic 6.0 中,类的公共接口是它的一组公共成员。

在 Visual Basic 2008 中,类的公共接口是它的一组公共成员,但是可以在 Visual Basic 程序中使用抽象类实现子类型多态性。

抽象类类似于 .NET Framework 的 Interface。抽象类是那些仅用作派生其他类的基类的类。抽象类通常用于表示抽象的概念或实体。

抽象类本身不能进行实例化;它必须被继承。该类的部分或全部成员可能是未实现的,需要依靠继承类来提供相应的实现。所实现的成员仍然可以被重写,继承类也仍然可以实现其他接口或功能。

有关更多信息,请参见 MustInherit

只读属性 (Property)

在 Visual Basic 6.0 中,若在 Property 过程中排除 Set 方法则可创建一个只读属性 (Property)。

在 Visual Basic 2008 中,必须对一个属性 (Property) 应用 ReadOnly 关键字,同时排除该属性 (Property) 的 Set 子句,才能使该属性 (Property) 只读。

也可以对字段应用 ReadOnly 关键字,以使其成为只读的。

有关更多信息,请参见 ReadOnly (Visual Basic)

反射

在 Visual Basic 6.0 中,不支持反射。

在 Visual Basic 2008 中,可以使用 .NET Framework 类库的 System.Reflection 命名空间中的类在运行时获取有关类型(如类、接口和值类型)的信息,并创建类型实例以调用和访问它们。

有关更多信息,请参见 Visual Studio 中的反射命名空间

共享的类和结构成员

在 Visual Basic 2008 中,可以将新的 Shared 关键字应用于 Property、Sub、Dim、Function、Operator 和 Event 语句,以与类或结构的所有实例共享这些语句。类的共享成员可以在不初始化类的情况下进行访问。

可以通过类的名称而不是类的实例来访问共享成员。

有关更多信息,请参见 Visual Basic 中的共享成员

源文件

在 Visual Basic 2008 中,程序由一个或多个源文件组成。源文件存储在文件扩展名为 .vb 的特殊类型的文件中。类型(如类、结构、接口、枚举和委托)的类型语句以及标准模块的语句都存储在程序的源代码文件中。Visual Basic 没有将源文件限制为只能定义一种类型,也不要求源文件的名称与源文件中定义的类型相匹配。

通过使用分部类型语句,可以在多个源文件中定义一个类或结构。在编译包含多个源文件的程序时,所有源文件将一起进行处理,就像在处理之前所有源文件串接成一个文件一样。

有关更多信息,请参见 Visual Basic 程序的结构分部 (Visual Basic)

用户定义的类型

在 Visual Basic 6.0 中,Type 语句用来将几个不同类型的变量组合为一个用户定义类型 (UDT)。

在 Visual Basic 2008 中,使用 Structure 和 Enum 语句定义用户定义的值类型。

使用 Class、Interface 和 Delegate 语句可定义用户定义的引用类型。

有关更多信息,请参见 结构:您自己的数据类型

变量声明

在 Visual Basic 6.0 中,可以在同一个语句中声明不同类型的变量。如果没有在语句中指定变量的数据类型,它的类型将默认为 Variant。

在 Visual Basic 2008 中,可以声明同一个数据类型的多个变量,而无需在语句中指定每个变量的数据类型。

有关更多信息,请参见 Visual Basic 中的变量声明

升级说明

在将 Visual Basic 6.0 应用程序升级到 Visual Basic 2008 时,面向对象的代码构造会以最有利的方式转换为最相近的 Visual Basic 2008 等效项。不应将转换后得到的代码作为示例来了解如何在 Visual Basic 2008 中进行面向对象的编程。

如果希望将经过升级的应用程序扩展为使用 Visual Basic 2008 的面向对象构造,则可能需要先修改升级后的代码。以下页面可帮助您开始这方面的工作。

请参见

任务

面向对象的编程示例

概念

类(针对 Visual Basic 6.0 用户)

对 Visual Basic 中的模块进行面向对象的更改

界面更改(针对 Visual Basic 6.0 用户)

继承(针对 Visual Basic 6.0 用户)

其他资源

语言更改(针对 Visual Basic 6.0 用户)

适用于 Visual Basic 6.0 用户的帮助