MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

Visual Basic类和对象的创建与使用

2023-03-227.8k 阅读

Visual Basic 类和对象的基础概念

什么是类和对象

在 Visual Basic 编程中,类是一种用户自定义的数据类型,它就像是一个模板或者蓝图,用于定义一组相关的数据(称为属性)和操作这些数据的代码(称为方法)。例如,我们要创建一个描述“汽车”的类,这个类可以包含诸如“颜色”“品牌”“速度”等属性,以及“启动”“加速”“刹车”等方法。

对象则是类的实例。当我们根据“汽车”类创建出一辆具体的汽车,比如一辆红色的宝马汽车,这就是“汽车”类的一个对象。每个对象都有自己独立的属性值,它们共享类中定义的方法。

类在 Visual Basic 中的地位和作用

类在 Visual Basic 编程中处于核心地位。它使得代码更加模块化、可维护和可复用。通过将相关的数据和操作封装在类中,我们可以将复杂的问题分解为多个简单的部分,每个部分都由一个类来处理。这不仅提高了代码的可读性,也方便团队协作开发。例如,在一个大型的企业级应用程序中,不同的开发人员可以负责不同的类,各自独立开发和测试,最后将这些类组合起来构建完整的应用。

类的创建

创建类的语法

在 Visual Basic 中,使用 Class 关键字来定义一个类。其基本语法如下:

Public Class ClassName
    '属性声明
    Private myVariable As DataType
    '方法声明
    Public Sub MethodName()
        '方法体代码
    End Sub
End Class

其中,ClassName 是你为类取的名字,应遵循 Visual Basic 的命名规则,通常以大写字母开头。myVariable 是类的一个属性,DataType 是该属性的数据类型,比如 Integer(整数)、String(字符串)等。MethodName 是类的一个方法,方法体中包含了具体的操作代码。

类的成员:属性和方法

属性

属性是类中用于存储数据的成员。可以使用 Private 关键字来声明一个私有属性,这意味着该属性只能在类内部被访问。例如:

Public Class Person
    Private name As String
    Private age As Integer
End Class

通常我们会为私有属性提供公共的访问方法,即属性过程(Property Procedures),以便在类外部安全地访问和修改这些属性。属性过程分为 GetSet 部分。Get 用于获取属性值,Set 用于设置属性值。例如:

Public Class Person
    Private name As String
    Private age As Integer

    Public Property Name() As String
        Get
            Return name
        End Get
        Set(ByVal value As String)
            name = value
        End Set
    End Property

    Public Property Age() As Integer
        Get
            Return age
        End Get
        Set(ByVal value As Integer)
            If value >= 0 And value <= 120 Then
                age = value
            Else
                Throw New ArgumentException("年龄必须在 0 到 120 之间")
            End If
        End Set
    End Property
End Class

在上述代码中,NameAge 属性都有 GetSet 过程。AgeSet 过程还添加了数据验证,确保设置的年龄值在合理范围内。

方法

方法是类中执行特定操作的一段代码。方法可以分为无参数方法和有参数方法。例如,一个无参数的方法:

Public Class Calculator
    Public Sub Reset()
        '执行重置操作的代码
    End Sub
End Class

一个有参数的方法:

Public Class Calculator
    Public Function Add(ByVal num1 As Double, ByVal num2 As Double) As Double
        Return num1 + num2
    End Function
End Class

在上述 Calculator 类中,Reset 方法用于执行重置操作,没有参数。而 Add 方法接受两个 Double 类型的参数,并返回它们的和。

类的访问修饰符

在 Visual Basic 中,类可以使用不同的访问修饰符来控制其可访问性。常见的访问修饰符有 PublicPrivateFriend

  • Public:声明为 Public 的类可以被项目中的任何代码以及引用该项目的其他项目中的代码访问。例如,如果你创建了一个供其他开发人员使用的类库,其中的一些类可能需要声明为 Public,以便外部代码能够使用。
Public Class UtilityClass
    '类的成员
End Class
  • Private:声明为 Private 的类只能在其所在的模块内被访问。这通常用于一些辅助类,这些类只在模块内部使用,不需要暴露给外部代码。
Private Class InternalHelperClass
    '类的成员
End Class
  • Friend:声明为 Friend 的类可以被同一程序集内的任何代码访问,但不能被引用该程序集的其他项目中的代码访问。这在项目内部的类需要在不同模块间共享,但又不想暴露给外部项目时很有用。
Friend Class SharedClassInAssembly
    '类的成员
End Class

对象的创建与初始化

创建对象的语法

在 Visual Basic 中,使用 New 关键字来创建类的对象。例如,对于前面定义的 Person 类:

Dim myPerson As New Person()

上述代码创建了一个 Person 类的对象,并将其赋值给变量 myPersonNew 关键字后面跟着类的构造函数,在这个例子中,Person 类使用了默认的无参数构造函数。

构造函数

构造函数是类中的一个特殊方法,用于在创建对象时初始化对象的属性。在 Visual Basic 中,构造函数的名称与类名相同。例如:

Public Class Person
    Private name As String
    Private age As Integer

    Public Sub New(ByVal newName As String, ByVal newAge As Integer)
        name = newName
        age = newAge
    End Sub

    Public Property Name() As String
        Get
            Return name
        End Get
        Set(ByVal value As String)
            name = value
        End Set
    End Property

    Public Property Age() As Integer
        Get
            Return age
        End Get
        Set(ByVal value As Integer)
            If value >= 0 And value <= 120 Then
                age = value
            Else
                Throw New ArgumentException("年龄必须在 0 到 120 之间")
            End If
        End Set
    End Property
End Class

现在我们可以使用带参数的构造函数来创建 Person 对象:

Dim myPerson As New Person("张三", 30)

对象的初始化方式

除了使用构造函数进行初始化外,还可以在创建对象后逐个设置属性值。例如:

Dim myPerson As New Person()
myPerson.Name = "李四"
myPerson.Age = 25

这种方式在对象的初始状态较为简单,或者需要根据不同的条件动态设置属性值时比较有用。另外,还可以使用对象初始值设定项来同时设置多个属性值,这是一种更简洁的方式:

Dim myPerson As New Person With {.Name = "王五",.Age = 35}

上述代码使用对象初始值设定项在创建 Person 对象时同时设置了 NameAge 属性。

对象的使用

访问对象的属性和方法

一旦创建了对象,就可以使用点(.)运算符来访问对象的属性和方法。例如,对于前面创建的 myPerson 对象:

Dim personName As String = myPerson.Name
myPerson.Age = 31

上述代码首先获取 myPerson 对象的 Name 属性值并赋值给 personName 变量,然后修改了 myPerson 对象的 Age 属性值。

对于对象的方法调用,同样使用点运算符。例如,对于 Calculator 类的对象:

Dim myCalculator As New Calculator()
Dim result As Double = myCalculator.Add(5, 3)

上述代码创建了一个 Calculator 类的对象 myCalculator,然后调用其 Add 方法,传入参数 5 和 3,并将返回的结果赋值给 result 变量。

对象的生命周期

对象的生命周期包括创建、使用和销毁三个阶段。在 Visual Basic 中,当使用 New 关键字创建对象时,对象进入创建阶段,此时构造函数被调用,对象的属性被初始化。在对象的使用阶段,程序可以访问对象的属性和方法,执行各种操作。

当对象不再被引用时,它进入销毁阶段。Visual Basic 使用垃圾回收机制来自动管理对象的内存释放。垃圾回收器会定期检查不再被任何变量引用的对象,并释放它们占用的内存。例如:

Dim myObject As New SomeClass()
'使用 myObject
myObject = Nothing '将变量设置为 Nothing,使对象不再被引用

在上述代码中,当将 myObject 设置为 Nothing 后,SomeClass 的对象不再被任何变量引用,垃圾回收器会在适当的时候回收该对象占用的内存。不过,对于一些需要手动释放资源的对象,比如文件句柄、数据库连接等,不能仅仅依赖垃圾回收机制,需要在代码中显式地调用释放资源的方法,例如 Close 方法来关闭文件或数据库连接。

类的继承

继承的概念和作用

继承是面向对象编程中的一个重要概念,它允许一个类(称为子类或派生类)从另一个类(称为父类或基类)中获取属性和方法。子类可以继承父类的所有非私有成员,并可以在此基础上添加新的成员或重写父类的方法。

继承的主要作用是代码复用和实现多态性。通过继承,我们可以避免在多个类中重复编写相同的代码,提高开发效率。例如,我们有一个 Animal 类,其中包含一些通用的属性和方法,如 Name 属性和 Eat 方法。然后我们可以创建 DogCat 等子类,它们继承自 Animal 类,自动拥有 Name 属性和 Eat 方法,同时还可以添加各自特有的属性和方法,如 Dog 类可以有 Bark 方法。

继承的语法

在 Visual Basic 中,使用 Inherits 关键字来实现继承。例如:

Public Class Animal
    Public Property Name() As String
    Public Sub Eat()
        Console.WriteLine(Name & "正在进食")
    End Sub
End Class

Public Class Dog
    Inherits Animal
    Public Sub Bark()
        Console.WriteLine(Name & "正在汪汪叫")
    End Sub
End Class

在上述代码中,Dog 类继承自 Animal 类,因此 Dog 类自动拥有 Name 属性和 Eat 方法。同时,Dog 类还添加了自己特有的 Bark 方法。

重写父类方法

有时候,子类需要对父类的方法进行不同的实现,这就需要使用 Overrides 关键字来重写父类的方法。例如,我们希望 Dog 类的 Eat 方法有不同的实现:

Public Class Animal
    Public Property Name() As String
    Public Overridable Sub Eat()
        Console.WriteLine(Name & "正在进食")
    End Sub
End Class

Public Class Dog
    Inherits Animal
    Public Sub Bark()
        Console.WriteLine(Name & "正在汪汪叫")
    End Sub

    Public Overrides Sub Eat()
        Console.WriteLine(Name & "正在啃骨头")
    End Sub
End Class

在上述代码中,Animal 类的 Eat 方法被声明为 Overridable,表示可以被子类重写。Dog 类使用 Overrides 关键字重写了 Eat 方法,提供了自己的实现。

多态性

多态性是指同一个方法调用在不同的对象上可以产生不同的行为。在 Visual Basic 中,多态性通过继承和方法重写来实现。例如:

Dim animals() As Animal = {New Dog() With {.Name = "旺财"}, New Animal() With {.Name = "普通动物"}}
For Each animal As Animal In animals
    animal.Eat()
Next

在上述代码中,animals 数组包含了 Dog 类和 Animal 类的对象。当循环调用 Eat 方法时,对于 Dog 类的对象,会调用其重写后的 Eat 方法,输出“旺财正在啃骨头”;对于 Animal 类的对象,会调用其原始的 Eat 方法,输出“普通动物正在进食”。这就是多态性的体现,相同的方法调用在不同类型的对象上产生了不同的行为。

类的其他特性

封装

封装是面向对象编程的一个重要原则,它将数据和操作数据的方法封装在一个类中,对外隐藏内部的实现细节。通过将属性声明为私有,并提供公共的属性过程和方法来访问和操作这些属性,我们实现了封装。例如,前面的 Person 类中,nameage 属性被声明为私有,外部代码只能通过 NameAge 属性过程来访问和修改它们,这样可以确保数据的安全性和一致性。

接口

接口是一种特殊的抽象类型,它定义了一组方法的签名,但不包含方法的实现。一个类可以实现一个或多个接口,以表明它提供了某些特定的行为。接口在 Visual Basic 中使用 Interface 关键字定义。例如:

Public Interface IShape
    Function Area() As Double
    Function Perimeter() As Double
End Interface

Public Class Circle
    Implements IShape
    Private radius As Double

    Public Sub New(ByVal r As Double)
        radius = r
    End Sub

    Public Function Area() As Double Implements IShape.Area
        Return Math.PI * radius * radius
    End Function

    Public Function Perimeter() As Double Implements IShape.Perimeter
        Return 2 * Math.PI * radius
    End Function
End Class

在上述代码中,IShape 接口定义了 AreaPerimeter 方法。Circle 类实现了 IShape 接口,并提供了这两个方法的具体实现。接口的主要作用是实现多态性和代码的松散耦合,使得不同的类可以通过实现相同的接口来提供统一的行为,方便代码的扩展和维护。

抽象类

抽象类是一种不能被实例化的类,它通常包含一些抽象方法(只有声明,没有实现)。抽象类使用 MustInherit 关键字声明,抽象方法使用 MustOverride 关键字声明。例如:

Public MustInherit Class Shape
    Public MustOverride Function Area() As Double
    Public MustOverride Function Perimeter() As Double
End Class

Public Class Rectangle
    Inherits Shape
    Private width As Double
    Private height As Double

    Public Sub New(ByVal w As Double, ByVal h As Double)
        width = w
        height = h
    End Sub

    Public Overrides Function Area() As Double
        Return width * height
    End Function

    Public Overrides Function Perimeter() As Double
        Return 2 * (width + height)
    End Function
End Class

在上述代码中,Shape 类是一个抽象类,它包含两个抽象方法 AreaPerimeterRectangle 类继承自 Shape 类,并实现了这两个抽象方法。抽象类的主要作用是为一组相关的类提供一个通用的基类,定义一些必须由子类实现的行为,同时也可以包含一些已经实现的方法和属性,供子类继承和复用。

通过深入了解 Visual Basic 中类和对象的创建与使用,包括类的基础概念、创建、对象的创建与初始化、使用,以及类的继承、封装、接口和抽象类等特性,开发人员能够编写出更加模块化、可维护和可复用的代码,从而提高软件开发的效率和质量。在实际编程中,应根据具体的需求和场景,合理运用这些面向对象的编程技术,构建出高效、健壮的应用程序。