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

Visual Basic面向对象编程基础

2022-05-084.1k 阅读

Visual Basic面向对象编程基础

面向对象编程概念简介

在深入Visual Basic的面向对象编程之前,我们先来简要回顾一下面向对象编程(Object - Oriented Programming,OOP)的核心概念。OOP将数据和操作数据的方法封装在一起,形成对象。这种编程范式主要基于三个关键特性:封装、继承和多态。

封装:是指将数据和操作数据的方法包装在一个单元(对象)中,对外部隐藏对象的内部实现细节。这使得对象的使用者只需要关心对象提供的公共接口,而不必了解其内部是如何实现的。例如,一个汽车对象,我们只需要知道如何通过启动按钮启动汽车(调用启动方法),而不需要知道发动机内部的复杂机械结构和电子控制逻辑。

继承:允许一个类(子类)从另一个类(父类)中获取属性和方法。子类继承了父类的特性,并且可以在此基础上添加新的特性或修改继承来的方法。比如,轿车类可以继承汽车类的基本属性(如车轮数量、发动机类型等)和方法(如启动、停止等),同时轿车类可以有自己特有的属性(如座位数量、是否有天窗等)。

多态:是指同一个方法在不同的对象上可以有不同的行为表现。例如,同样是“绘制”方法,在圆形对象上绘制的是圆形,在矩形对象上绘制的则是矩形。这为代码的灵活性和可扩展性提供了很大的便利。

Visual Basic中的类与对象

类的定义 在Visual Basic中,使用Class关键字来定义一个类。类是对象的蓝图,它定义了对象所具有的属性(数据)和方法(操作)。下面是一个简单的类定义示例:

Public Class Person
    '定义属性
    Private m_name As String
    Private m_age As Integer

    '属性的访问器(getter和setter方法)
    Public Property Name() As String
        Get
            Return m_name
        End Get
        Set(ByVal value As String)
            m_name = value
        End Set
    End Property

    Public Property Age() As Integer
        Get
            Return m_age
        End Get
        Set(ByVal value As Integer)
            If value >= 0 And value <= 120 Then
                m_age = value
            Else
                '这里可以抛出异常,为简单起见,暂不处理
                m_age = 0
            End If
        End Set
    End Property

    '定义方法
    Public Sub SayHello()
        Console.WriteLine("Hello, my name is " & m_name & " and I'm " & m_age & " years old.")
    End Sub
End Class

在上述代码中,我们定义了一个Person类。该类有两个私有字段m_namem_age,分别用于存储人的姓名和年龄。通过属性NameAge来提供对这些私有字段的安全访问。属性Name允许读取和设置m_name的值,而属性Age在设置值时会进行简单的验证,确保年龄在合理范围内。SayHello方法则用于输出这个人的基本信息。

对象的创建与使用 定义好类之后,就可以创建该类的对象并使用其属性和方法。以下是创建和使用Person类对象的示例:

Module Module1
    Sub Main()
        '创建Person类的对象
        Dim person1 As New Person()
        person1.Name = "John"
        person1.Age = 30
        person1.SayHello()

        Dim person2 As New Person()
        person2.Name = "Jane"
        person2.Age = 25
        person2.SayHello()
    End Sub
End Module

Main方法中,我们创建了两个Person类的对象person1person2。通过对象名访问属性来设置对象的姓名和年龄,然后调用SayHello方法输出对象的信息。运行这段代码,控制台将输出:

Hello, my name is John and I'm 30 years old.
Hello, my name is Jane and I'm 25 years old.

Visual Basic中的封装

在Visual Basic中,封装主要通过访问修饰符和属性来实现。

访问修饰符 Visual Basic提供了几种访问修饰符,用于控制类、属性、方法等成员的访问级别。

  • Public:公共访问修饰符,成员可以从程序的任何地方访问。例如,上述Person类中的Name属性、Age属性和SayHello方法都是Public的,外部代码可以直接访问。
  • Private:私有访问修饰符,成员只能在定义它们的类内部访问。Person类中的m_namem_age字段是Private的,外部代码无法直接访问,只能通过NameAge属性来间接访问。
  • Friend:友元访问修饰符,成员可以在同一程序集内的任何代码中访问,但在程序集外部无法访问。如果一个项目包含多个类库,只有在同一个类库中的代码才能访问Friend成员。

属性实现封装 属性不仅提供了对私有字段的访问方式,还可以在属性的GetSet访问器中添加逻辑,从而实现数据的验证、计算等功能,进一步增强封装性。例如,在Person类的Age属性的Set访问器中,我们对设置的年龄值进行了验证,确保其在合理范围内。这种方式使得外部代码在设置Age属性时,必须遵守我们定义的规则,而无需关心内部是如何验证的,从而隐藏了内部实现细节。

Visual Basic中的继承

继承在Visual Basic中通过Inherits关键字来实现。子类继承父类的属性和方法,并可以根据需要进行扩展和修改。

简单继承示例 假设我们有一个Animal类,然后定义一个Dog类继承自Animal类。

Public Class Animal
    Private m_name As String

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

    Public Sub MakeSound()
        Console.WriteLine("The animal makes a sound.")
    End Sub
End Class

Public Class Dog
    Inherits Animal

    Public Sub Bark()
        Console.WriteLine("Woof!")
    End Sub

    '重写父类的MakeSound方法
    Public Overrides Sub MakeSound()
        Console.WriteLine("The dog barks: Woof!")
    End Sub
End Class

在上述代码中,Dog类通过Inherits Animal语句继承了Animal类。Dog类自动拥有了Animal类的Name属性和MakeSound方法。同时,Dog类定义了自己特有的Bark方法,并且重写了Animal类的MakeSound方法,以提供更具体的行为。

使用继承 以下是使用AnimalDog类的示例:

Module Module1
    Sub Main()
        Dim animal As New Animal()
        animal.Name = "Generic Animal"
        animal.MakeSound()

        Dim dog As New Dog()
        dog.Name = "Buddy"
        dog.MakeSound()
        dog.Bark()
    End Sub
End Module

运行上述代码,控制台将输出:

The animal makes a sound.
The dog barks: Woof!
Woof!

从输出结果可以看出,Animal类的MakeSound方法和Dog类重写后的MakeSound方法表现出了不同的行为,同时Dog类还能调用自己特有的Bark方法。

继承中的多态 多态在继承关系中体现得尤为明显。当我们使用父类类型的变量来引用子类对象时,根据实际对象的类型,调用的方法会表现出不同的行为。以下是一个示例:

Module Module1
    Sub Main()
        Dim animals() As Animal = {New Animal(), New Dog()}
        For Each animal In animals
            animal.MakeSound()
        Next
    End Sub
End Module

在这个示例中,我们创建了一个Animal类型的数组,其中包含一个Animal对象和一个Dog对象。当遍历这个数组并调用MakeSound方法时,对于Animal对象,会调用Animal类本身的MakeSound方法;对于Dog对象,会调用Dog类重写后的MakeSound方法。这就是多态的体现,相同的方法调用,根据对象的实际类型产生不同的行为。

Visual Basic中的多态

除了在继承关系中通过重写方法实现多态外,Visual Basic还支持接口实现多态。

接口的定义与实现 接口是一种契约,它定义了一组方法的签名,但不包含方法的实现。类通过实现接口来承诺提供接口中定义的方法。以下是一个接口定义和类实现接口的示例:

'定义接口
Public Interface IDrawable
    Sub Draw()
End Interface

'圆形类实现IDrawable接口
Public Class Circle
    Implements IDrawable

    Private m_radius As Double

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

    Public Sub Draw() Implements IDrawable.Draw
        Console.WriteLine("Drawing a circle with radius " & m_radius)
    End Sub
End Class

'矩形类实现IDrawable接口
Public Class Rectangle
    Implements IDrawable

    Private m_width As Double
    Private m_height As Double

    Public Sub New(ByVal width As Double, ByVal height As Double)
        m_width = width
        m_height = height
    End Sub

    Public Sub Draw() Implements IDrawable.Draw
        Console.WriteLine("Drawing a rectangle with width " & m_width & " and height " & m_height)
    End Sub
End Class

在上述代码中,我们定义了IDrawable接口,该接口只有一个Draw方法。Circle类和Rectangle类都实现了IDrawable接口,并提供了Draw方法的具体实现。

使用接口实现多态 以下是使用接口实现多态的示例代码:

Module Module1
    Sub Main()
        Dim drawables() As IDrawable = {New Circle(5), New Rectangle(10, 5)}
        For Each drawable In drawables
            drawable.Draw()
        Next
    End Sub
End Module

运行上述代码,控制台将输出:

Drawing a circle with radius 5
Drawing a rectangle with width 10 and height 5

这里我们创建了一个IDrawable类型的数组,其中包含Circle对象和Rectangle对象。通过遍历这个数组并调用Draw方法,根据对象的实际类型(CircleRectangle),调用了相应类中实现的Draw方法,实现了多态。

构造函数与析构函数

在Visual Basic中,类可以有构造函数和析构函数,用于对象的初始化和清理工作。

构造函数 构造函数是在创建对象时自动调用的特殊方法,用于初始化对象的状态。在Visual Basic中,构造函数的名称与类名相同。以下是在Person类中添加构造函数的示例:

Public Class Person
    Private m_name As String
    Private m_age As Integer

    '带参数的构造函数
    Public Sub New(ByVal name As String, ByVal age As Integer)
        m_name = name
        If age >= 0 And age <= 120 Then
            m_age = age
        Else
            m_age = 0
        End If
    End Sub

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

    Public Property Age() As Integer
        Get
            Return m_age
        End Get
        Set(ByVal value As Integer)
            If value >= 0 And value <= 120 Then
                m_age = value
            Else
                m_age = 0
            End If
        End Set
    End Property

    Public Sub SayHello()
        Console.WriteLine("Hello, my name is " & m_name & " and I'm " & m_age & " years old.")
    End Sub
End Class

在修改后的Person类中,我们添加了一个带参数的构造函数New。这个构造函数在创建Person对象时接受姓名和年龄作为参数,并对年龄进行验证后初始化对象的状态。现在我们可以这样创建Person对象:

Module Module1
    Sub Main()
        Dim person As New Person("Tom", 28)
        person.SayHello()
    End Sub
End Module

运行上述代码,控制台将输出:

Hello, my name is Tom and I'm 28 years old.

析构函数 析构函数用于在对象被销毁时执行清理工作,例如释放非托管资源(如文件句柄、数据库连接等)。在Visual Basic中,析构函数通过Finalize方法来实现。不过,在现代的.NET环境下,垃圾回收机制会自动管理大部分资源,手动编写析构函数的情况相对较少。以下是一个简单的析构函数示例:

Public Class ResourceHolder
    '假设这里有一个非托管资源,为简单起见,用一个字符串模拟
    Private unmanagedResource As String

    Public Sub New()
        unmanagedResource = "Some unmanaged resource"
    End Sub

    '析构函数
    Protected Overrides Sub Finalize()
        '释放非托管资源
        unmanagedResource = Nothing
        MyBase.Finalize()
    End Sub
End Class

在上述ResourceHolder类中,我们假设unmanagedResource代表一个非托管资源。在析构函数Finalize中,我们将其设置为Nothing来模拟资源的释放。需要注意的是,垃圾回收器何时调用析构函数是不确定的,因此在编写析构函数时要确保不会依赖于确定性的资源释放顺序。

总结Visual Basic面向对象编程要点

通过以上内容,我们详细介绍了Visual Basic中面向对象编程的基础概念,包括类与对象的定义和使用、封装、继承、多态、构造函数与析构函数等。

  • 类是对象的蓝图,定义了对象的属性和方法,通过创建对象来使用类的功能。
  • 封装通过访问修饰符和属性来实现,隐藏对象的内部细节,只提供公共接口供外部使用。
  • 继承允许子类从父类获取属性和方法,并可以进行扩展和重写,实现代码的复用和层次化设计。
  • 多态通过重写父类方法或实现接口,使得相同的方法调用在不同对象上表现出不同的行为,提高代码的灵活性和可扩展性。
  • 构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理。

掌握这些面向对象编程的基础知识,对于使用Visual Basic进行高效、可维护的软件开发至关重要。在实际项目中,合理运用这些特性可以构建出结构清晰、易于扩展和维护的应用程序。随着对Visual Basic面向对象编程的深入学习和实践,开发者能够更好地应对各种复杂的编程需求,开发出高质量的软件产品。

希望通过本文的介绍,读者对Visual Basic面向对象编程基础有了更深入的理解和掌握,能够在实际编程工作中灵活运用这些知识,提升自己的编程能力和效率。

以上是关于Visual Basic面向对象编程基础的较为详细的介绍,涵盖了其核心概念和相关代码示例,帮助读者全面了解并上手使用Visual Basic进行面向对象编程。在实际应用中,还需要结合具体的业务需求和项目场景,不断实践和探索,以充分发挥Visual Basic面向对象编程的优势。