在 Visual Basic .NET 中创建类

 

保罗·警长
PDSA, Inc.

2001 年 11 月

总结: 本文介绍如何在 Microsoft Visual Basic .NET 中创建类,介绍 Visual Basic 6.0 和 Visual Basic .NET 在类方面的差异,并介绍如何向类添加属性和方法。 ) (11 个打印页

目标

  • 了解如何在 Microsoft® Visual Basic® .NET 中创建类
  • 了解 Visual Basic 6.0 与 Visual Basic .NET 在类方面的差异
  • 了解如何向类添加属性
  • 了解如何向类添加方法

假设

  • 已在 Visual Basic 6.0 中创建类
  • 你了解 OOP 的基础知识
  • 了解如何在 Microsoft Visual Studio® .NET 中生成基本窗体

目录

Object-Oriented编程概述
   类的良好用途
   创建类
   创建属性
   Read-Only属性
   创建Write-Only属性
   创建方法
   将数据传递给构造函数
   对所有任务使用类
总结
   关于作者

Object-Oriented编程概述

Object-Oriented 编程 (OOP) 是一种软件设计和构建方法。 这是在结构化编程之后的下一个逻辑进展,以提高代码可重用性和可维护性。 换句话说,OOP 是一种设计单个软件组件的方法, (类) 关联行为 (方法) 和数据限制 (属性) ,并帮助你将这些组件组合在一起以创建完整的应用程序。

关于 OOP 的最好之处在于,它允许将数据分组到程序中的类中包含的离散变量中。 此数据是分开的,与应用程序中的任何其他类不同。 任何类都不能干扰任何其他类中的数据,而无需通过该类上的特定接口。

每个对象将其功能定义为它将响应的一组属性和方法。 其他代码可以在 对象上调用这些方法,并让它们执行某些行为,并使用属性来检索或更改某些信息。 这样,代码就不能直接影响其他对象的信息或进程。 生成类时,你将了解如何使用属性和方法生成此功能。

表 1 是阅读本文档之前应已熟悉的 OOP 术语的回顾。

表 1:OOP 术语

数据和代码的容器。 可以使用属性访问 类中的数据。 代码称为 方法。
Object 内存中类的实例。 实例是使用 Dim 语句和 New 关键字 (keyword) 创建的。
构造函数 首次实例化对象时自动调用的过程。 在 Visual Basic 6.0 中,构造 函数Class_Initialize调用。 在 Visual Basic .NET 中,构造函数称为 New
析 构 函数 销毁对象时自动调用的过程。 在 Visual Basic 6.0 中,析构 函数Class_Terminate调用。 在 Visual Basic .NET 中,析构函数称为 Finalize
属性 由 对象公开的例程,用于公开数据,并允许对象外部的代码影响对象数据。
方法 一个可由 对象执行的操作。 在 Visual Basic .NET 中,方法定义为 SubsFunctions

类的良好用途

类是面向对象的语言的核心和灵魂。 每当在 Visual Basic .NET 中编写最简单的程序时,你都会发现自己使用类。 Microsoft .NET Framework广泛使用类,因此应该如此。 下面是类的一些常见用法:

  • 总结对数据库表执行的表示形式和操作集,例如添加、编辑、删除和检索数据。
  • 包装用于处理文本文件的操作和数据集,例如读取、写入和索引文件中的文本行。
  • 将程序中的所有全局变量包装成类中的属性。 这有助于跟踪“自由浮动”全局的数量,这些全局似乎以某种方式进入许多计划。

创建类

让我们创建一个表示文本行的类。 为此,需要创建一个属性来返回文本行,并创建一个只读属性来返回文本的长度。 你还将创建一个方法,用于返回行中的第一个单词。 执行所有这些步骤时,你将了解创建类的正确方法。 你将生成一个类似于图 1 所示的窗体,以在生成 Line 类时对其进行测试。

图 1. 此窗体允许您测试 Line 类的每个属性和方法

若要创建窗体

  1. 打开 Visual Studio .NET。

  2. 从屏幕左侧的树视图中选择“Visual Basic 项目”。

  3. 选择“ Windows 应用程序” 作为项目模板。

  4. 将应用程序的名称设置为 ClassCreation

  5. 在解决方案资源管理器窗口中,选择 Form1.vb 窗体,并将其重命名为 frmLineTest.vb。 若要在解决方案资源管理器窗口中重命名窗体,请右键单击该窗体,然后在快捷菜单上选择“重命名”。

  6. 通过添加相应的控件并设置这些控件的属性,创建如图 1 所示的窗体,如表 2 中所述。

    表 2:用于生成窗体以测试 Line 类的控件

    控件类型 属性
    Label 名称 Label1
      文本 文本行
    TextBox 名称 txtLine
      文本 西班牙的雨主要停留在平原上
    CommandButton 名称 btnDisplay
      文本 显示长度
    TextBox 名称 txtLength
      ReadOnly True
    CommandButton 名称 btnGetWord
      文本 获取 Word
    TextBox 名称 txtWord
      文本  
      ReadOnly True

创建 Line 类

  1. 单击“项目”,然后单击“添加类”,打开“添加新项”对话框。

  2. “名称” 属性设置为“ Line ”,然后单击“ 确定”。

  3. 现在,项目和 Visual Studio .NET 环境中的代码窗口中会显示一个新文件。 在“代码”窗口中,将有如下所示的代码:

    Public Class Line
    
    End Class
    

    必须为此类创建的所有属性和方法必须在这些代码行之间输入。

创建属性

若要在类中创建属性,可以创建字段 (。公共变量) ,或者可以使用 Property 语句创建 Private 变量并公开 Private 变量。 你希望仅通过 Property 语句公开属性有几个原因。

  • 可以创建只读或只写属性,而不是公共变量,后者始终是读写的。
  • 可以在 Property 语句中添加错误处理,以检查设置的无效值。 设置 Public 变量时,无法检查无效值,因为没有运行任何代码来响应设置 Public 变量。
  • 可以将计算值作为属性公开,即使它们未作为实际数据存储在类中。 一个示例是 Length 属性。 你可能不想存储文本行的长度,因为它可能会更改。

现在将为 Line 类创建两个名为 LineLength 的属性。 首先创建一个私有变量,用于保存存储在 类中的数据行。 接下来,将为这两个新属性创建 Property 语句。 修改项目中的 类,使其如下所示的代码。

Public Class Line

    Private mstrLine As String

    Property Line() As String
        Get
           Return mstrLine
        End Get
        Set(ByVal Value As String)
            mstrLine = Value
        End Set
    End Property
     
    ReadOnly Property Length() As Integer
       Get
           Return mstrLine.Length
       End Get
    End Property
End Class

用于创建属性的语法相当简单,但与在 Visual Basic 6.0 中执行的操作大不相同。 首先使用关键字 (keyword) 属性,然后是属性的名称,然后是此属性将返回或设置的数据类型。 若要返回私有变量 mstrLine 中包含的数据,请使用 Get...End Get 块。 此块类似于 Visual Basic 6.0 中的旧 Property Get 函数。 此代码块执行 Get... 之间的任何代码 结束 Get 块并返回字符串值。 在 Visual Basic .NET 中,可以使用 Return 语句返回数据。

The Set...End Set 块类似于 Visual Basic 6.0 中使用的旧 Property Let 过程。 此块接受名为 Value 的参数。 值是 Visual Studio 自动为你创建的默认名称。 如果需要,可以更改它。 可以获取传递给此 Set 块的值,并将其置于专用变量中。 这是你可以放置任何所需的错误处理代码的位置。 例如,可以检查,以确保传递给 Value 参数的数据不会用“Test”之类的单词填充。 如果传入了垃圾字,你可能会选择引发错误,指出这不是此属性的有效值。

Read-Only属性

在上面的代码中,还通过在 Property 语句前面使用 ReadOnly 关键字 (keyword) 创建了只读属性。 使用此关键字 (keyword) 时,Visual Studio .NET 会添加 Get...结束 Property 语句的 Get 块。 事实上,如果尝试添加 Set...End Set 块,将收到编译器错误。 如果要在 Visual Basic 6.0 中创建只读属性,则未创建 Property Let 过程,但如果将其关闭,则不会生成任何错误。 你只是无法在运行时设置 属性。

试用

在创建的项目中,有一个类和一个窗体。 现在,你将在窗体中编写代码,以创建新的 Line 对象,将一行文本放入对象的 Line 属性中,然后将行的长度放入窗体上 txtLength 文本框的 Text 属性中。

  1. 在解决方案资源管理器窗口中,双击 frmLineTest 窗体以在设计模式下显示窗体。

  2. 双击“ 显示长度 ”按钮。 Visual Basic .NET 在此表单背后的代码中创建 btnDisplay_Click 事件过程。 只需在过程正文中填写下面所示的代码行。

    Private Sub btnDisplay_Click( _
      ByVal sender As Object, _
      ByVal e As System.EventArgs) Handles btnDisplay.Click
    
        Dim oLine As Line 
    
        oLine = New Line()
    
        oLine.Line = txtLine.Text
        txtLength.Text = oLine.Length.ToString()
    End Sub
    

在此事件过程中,使用 Dim 语句创建名为 oLine 的变量。 此变量定义为对 Line 类的引用。 实际上,使用 New 关键字 (keyword) 创建新的对象引用,如 Dim 语句后面的下一行所示。 新关键字 (keyword) 后必须后跟要实例化的类的名称。 Visual Basic .NET 和 Visual Basic 6.0 之间的另一个区别是,在创建新对象时,不再使用 Set 关键字 (keyword) 。

在 Visual Basic .NET 中,可以将这两行合并为一行,如下面的代码所示。

Dim oLine As Line = New Line()
Or
Dim oLine as New Line()

Visual Basic .NET (和所有 .NET 语言) 允许在同一行上声明和初始化任何变量。 在 Visual Basic 6.0 中,你无法执行此操作,因为 Dim 语句不是可执行的代码行。 在 Visual Basic .NET 中,Dim 是可执行代码行,因此此语法完全合法。

现在,让我们检查此事件过程的接下来两行:

oLine.Line = txtLine.Text
txtLength.Text = CStr(oLine.Length)

第一行将 对象中的 Line 属性设置为等于窗体上 txtLine 文本框的 Text 属性中包含的值。 这会将 Text 属性中的数据传递给 Set... 中的 Value 变量 Line 对象中的 End Set 块。

现在,你已准备好报告 txtLine 文本框中包含的字符串的长度。 请记住,将此文本框的值设置为字符串“西班牙的雨主要停留在普通”。这是包含在 对象内的 mstrLine 变量中的值。 可以在 Line 对象上调用 Length 属性,它将返回此特定字符串的长度。 由于 Length 属性是 Integer 值,因此需要先将该值转换为字符串,然后才能将其放入 txtLength 文本框的 Text 属性中。 可以通过将 ToString 方法应用于 Length 属性来实现此目的。

创建Write-Only属性

只写属性是定义 Set...End Set 块和 no Get...End Get 块。 只能在运行时将数据放入此属性,但无法从此属性检索数据。

如果要扩展此 Line 类,以便能够从磁盘上的文件中读取中的文本行,可以将文件名传递给此类。 可以使用只写属性来实现此目的。 下面是只写属性可能的外观示例。

WriteOnly Property FileName() As String
    Set(ByVal Value As String)
        mstrFileName = Value
    End Set
End Property

此语法再次不同于 Visual Basic 6.0,因为使用 WriteOnly 关键字 (keyword) 作为 Property 语句的前缀。 Visual Studio .NET 创建 Set...End Set 块自动为你。 如果尝试添加 Get...结束 Get 块,编译器会给你一个错误。

创建方法

类中的方法可以是对类中的数据执行某种操作的过程。 或者,方法可以是对数据执行某些操作并从 类返回该数据的函数。 为了能够从此类的实例调用方法,必须将该方法声明为 Public。 如果方法声明为 Private,则只有类中的其他方法才能调用该方法。 在 Visual Basic .NET 中创建方法与 Visual Basic 6.0 中的方法完全相同。

让我们在 Line 类中创建一个方法,该方法将传递到类中的文本行分解为每个单独的单词。 此方法是一个函数,它返回传入的文本行中包含的第一个单词。 如果使用在创建窗体时提供给你的字符串,则文本行将为“西班牙的雨主要停留在平原上”。在这种情况下,返回的第一个单词将是“The”。

  1. 在设计模式下打开 Line.vb 类。

  2. Property 语句的正下方,创建以下方法:

    Public Function GetWord() As String
        Dim astrWords() As String
    
        astrWords = Split(mstrLine, " ")
    
        Return astrWords(0)
    End Function
    

GetWord 方法使用 Split 函数将字符串转换为单个单词的数组。 Split 函数自 Visual Basic 6.0 以来一直存在,并传递了要查找的字符串和分隔符。 拆分从字符串中的第一个字符开始,并继续在字符串中移动,直到找到分隔符。 找到后,它会将所有字符串带到该点并创建新的数组元素。 然后,它继续以这种方式处理字符串,直到将完整的字符串放入数组元素中。

将字符串转换为数组后,可以返回传递到 Line 类的句子中的任何单词。 此示例仅通过访问数组的第一个元素返回第一个单词。 在 Visual Basic .NET 中,所有数组都是从零开始的,就像 Visual Basic 6.0 中的默认值一样。 此处的区别在于,在 Visual Basic .NET 中不能创建从零开始的数组,并且可以在 Visual Basic 6.0 中生成任何其他数组。

注意编写代码以将 mstrLine 变量中的单词分隔成数组的另一种方法是在 String 对象上使用 Split 方法,如下所示。

astrWords = mstrLine.Split(" ".ToCharArray())

试用

按照以下步骤尝试刚编写的此新 GetWord 方法。

  1. 在设计模式下打开 frmLineTest 窗体。

  2. 双击“获取Word”按钮。 这将打开代码窗口,其中包含为你创建的btnGetWord_Click事件过程。

  3. 将以下代码添加到此事件过程,如以下示例所示。

    Private Sub btnGetWord_Click(ByVal sender As Object,_
     ByVal e As System.EventArgs)
    
        Dim oLine As New Line()
    
        oLine.Line = txtLine.Text
        txtWord.Text = oLine.GetWord()
    
    End Sub
    

此事件过程首先在对象变量 oLine 中创建 Line 类的新实例。 接下来,通过从 txtLine 文本框的 Text 属性获取值,在行类 上设置 Line 属性。 最后,调用新的 GetWord 方法并返回字符串值。 此值将分配给本文前面在 frmLineTest 窗体上创建的 txtWord 文本框的 Text 属性中。

将数据传递给构造函数

在 Visual Basic 6.0 中,创建类的新实例时无法传递数据。 这意味着必须创建 对象,记住调用初始化方法,并将数据传递给该方法。 如果忘记初始化 对象,则对象失败。 虽然 你可能 记得调用此初始化方法,但如果其他程序员使用了你的类,他们可能不知道要调用它。

此问题已在 Visual Basic .NET 中解决,因为构造函数方法现在可以传递数据。 构造函数方法在 Visual Basic .NET 中称为 New。 默认情况下,Visual Basic .NET 会为你创建此 New 方法,而无需执行任何操作。 不会在代码模块中看到此代码,但它隐式存在。 如果要将某些数据传递给此 New 方法,则需要显式创建它。

可以将 New 构造函数放置在类中的任意位置,但你可能希望选择一个标准位置,例如始终靠近类定义的顶部。 在下一个练习中,将创建一个接受 String的新构造函数。 通过执行此操作,你将能够在一个步骤中声明、初始化对象变量并设置 Line 对象的数据。

  1. 打开项目中的 Line.vb 类。

  2. 如下所示,将 Sub New 添加到 Line 类:

    Public Class Line
        Private mstrLine As String
    
        Public Sub New(ByVal Value As String)
            mstrLine = Value
        End Sub
    

New 构造函数是编写以接受一个或多个参数的过程。 在刚刚编写的代码中,你创建了一个名为 Value 的参数。 然后,获取值并将其分配给私有变量 mstrLine。 现在,需要更改窗体中的过程,以便将 txtLine 文本框中的值传递给构造函数。

  1. 打开 frmLineTest.vb 窗体。

  2. 需要更改 btnDisplay_Click 事件过程和 btnGetWord_Click 事件过程,以声明 oLine 变量,如下所示。

    Dim oLine As New Line(txtLine.Text)
    

New 关键字 (keyword) 告知 Visual Basic .NET 创建 Line 的新实例,并将 txtLine 文本框的 Text 属性中包含的数据传递给 New 构造函数。

需要更改这两个事件过程,然后才能运行项目。 通过将 New 过程更改为接受参数, Line 类的任何声明现在都必须在声明对象时传递一些数据。

试用

对事件过程进行更改后,可以再次尝试运行该程序,以确保正确执行。

  1. F5 运行此应用程序。
  2. 如果收到任何错误,请修复这些错误,然后重试。

对所有任务使用类

最好为所有编程任务创建类。 Visual Basic .NET 仍允许在模块中创建独立的函数和过程。 但是,与传统结构化编程技术) ,使用 (类和对象具有相当多的优势:

  • 计算或操作封装 (包装) 到易于使用的接口中。 这有助于较新的程序员解决手头的问题,而无需了解一切的工作原理。 这也有助于老专业人员大大加快他们的开发时间。
  • 可以轻松更改类的内部工作,使其性能更好。 使用此类的任何程序都可获得性能改进的好处。
  • 一次可以在内存中使类的多个实例处于活动状态。 这样,当您希望将一个源中的多个值与另一个源的值进行比较时,就无需创建多个公共变量。
  • 可以从类继承并扩展功能,而无需更改原始类。 继承在名为“从基类继承”的单独文档中介绍。

Visual Basic .NET 与 Visual Basic 6.0 的区别

在 Visual Basic 6.0 中的 Visual Basic .NET 中创建类的方式有很多差异。 下面是主要列表。

  • 现在使用公共类...结束类以定义类。 在 Visual Basic 6.0 中,每个类都必须位于其自己的独立文件中。
  • 每个文件可以有多个类。
  • 属性声明与 Visual Basic 6.0 完全不同。
  • 不再使用 Set 关键字 (keyword) 来实例化类的新实例或设置对象引用。
  • 现在可以将参数传递给类的构造函数。

总结

现已创建一个类,该类具有一个读/写属性、一个只读属性和一个方法。 还将数据传递到此类的构造函数中。 如本文开头所述,OOP 是关于将软件组件拼凑在一起的能力,可帮助你更轻松地创建应用程序。 通过创建 Line 类,无需记住如何计算文本行长度的详细信息,也无需使用 Split 函数返回文本行的第一个单词。 相反,你使用了 Line 类,传递了该行,并使用属性和方法为你执行这些操作。 这是一种更优雅的编程方法。

关于作者

Paul D. Sheriff 是 PDSA, Inc. (www.pdsa.com) 的所有者,该公司是南加州的一家定制软件开发和咨询公司。 Paul 是南加州的 MSDN 区域总监,是一本名为 Paul Sheriff 教 Visual Basic 的 Visual Basic 6 书籍的作者,并制作了超过 72 个有关 Visual Basic、SQL Server、.NET 和 Keystone 学习系统的 Web 开发的视频。 保罗与人合著了一本名为 《ASP.NET Jumpstart》的书。 有关详细信息,请访问 PDSA, Inc. 网站。

关于 Informant Communications 组

Informant Communications Group, Inc. (www.informant.com) 是一家专注于信息技术行业的多元化媒体公司。 ICG专门从事软件开发出版物、会议、目录发布和网站,成立于1990年。 ICG 在美国和英国设有办事处,是受人尊敬的媒体和营销内容集成商,满足了 IT 专业人员对优质技术信息的需求。

版权所有 © 2001 Informant Communications Group 和 Microsoft Corporation

技术编辑:PDSA, Inc.和 KNG 咨询