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

Visual Basic面向对象编程基础概念

2021-04-224.0k 阅读

一、Visual Basic 面向对象编程概述

Visual Basic(VB)是一种由微软公司开发的结构化、模块化、面向对象的、包含协助开发环境的事件驱动编程语言。面向对象编程(OOP)是 VB 中一个核心的编程范式,它基于一系列基础概念,这些概念改变了软件开发的方式,使得代码更易于维护、扩展和复用。

1.1 什么是对象

在现实世界中,对象无处不在。例如,一辆汽车是一个对象,它有自己的属性(如颜色、型号、速度)和行为(如启动、加速、刹车)。在 VB 的面向对象编程中,对象是对现实世界中实体的抽象表示。每个对象都有特定的数据(属性)和可执行的操作(方法)。 例如,在 VB 中创建一个简单的TextBox对象,它具有Text属性(用于获取或设置文本框中的文本内容)和SetFocus方法(用于将输入焦点设置到该文本框上)。

1.2 类的概念

类是对象的蓝图或模板。它定义了对象的属性和方法。就像汽车制造商根据设计蓝图来制造汽车一样,我们根据类来创建对象。一个类可以看作是一种数据类型,只不过这种数据类型不仅包含数据(属性),还包含操作这些数据的函数(方法)。 例如,下面定义一个简单的Person类:

Public Class Person
    '定义属性
    Public Name As String
    Public Age As Integer
    
    '定义方法
    Public Sub SayHello()
        MsgBox("Hello, my name is " & Name & " and I'm " & Age & " years old.")
    End Sub
End Class

在上述代码中,Person类定义了两个属性NameAge,以及一个方法SayHello

二、Visual Basic 中的属性

2.1 属性的定义与访问

属性是对象的数据成员,用于描述对象的特征。在 VB 中,属性可以通过两种方式定义:简单属性和属性过程。

2.1.1 简单属性

简单属性就像普通的变量声明,如上面Person类中的NameAge。它们可以直接被访问和赋值。

Dim p As New Person
p.Name = "John"
p.Age = 30

2.1.2 属性过程

属性过程提供了更灵活的方式来控制属性的访问。属性过程分为Get过程(用于获取属性值)和Set过程(用于设置属性值)。 例如,我们为Person类的Age属性添加验证逻辑,使用属性过程来实现:

Public Class Person
    Private m_Age As Integer
    
    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
                MsgBox("Invalid age value.")
            End If
        End Set
    End Property
    
    '其他属性和方法保持不变
    Public Name As String
    
    Public Sub SayHello()
        MsgBox("Hello, my name is " & Name & " and I'm " & Age & " years old.")
    End Sub
End Class

在上述代码中,Age属性通过GetSet过程来控制对m_Age私有变量的访问,并且在Set过程中添加了年龄的验证逻辑。

2.2 属性修饰符

在 VB 中,属性可以使用不同的修饰符来控制其访问级别和其他特性。

2.2.1 Public 修饰符

Public修饰的属性可以从类的外部访问。例如,上述Person类中的Name属性和Age属性(在修改为属性过程后依然可以被外部访问),外部代码可以直接读写这些属性。

2.2.2 Private 修饰符

Private修饰的属性只能在类的内部访问。如上述Person类中的m_Age变量,它只能在Person类的内部被访问和修改,外部代码无法直接操作它。这样可以保护类的内部数据,防止外部不恰当的修改。

2.2.3 Protected 修饰符

Protected修饰的属性可以在类的内部以及从该类派生的子类中访问。例如,如果有一个Employee类继承自Person类,那么Employee类可以访问Person类中被Protected修饰的属性。

三、Visual Basic 中的方法

3.1 方法的定义与调用

方法是对象能够执行的操作。在 VB 中,方法定义在类中,通过对象来调用。

3.1.1 无参数方法

如前面Person类中的SayHello方法,它不接受任何参数,直接执行显示问候信息的操作。

Dim p As New Person
p.Name = "Alice"
p.Age = 25
p.SayHello()

3.1.2 有参数方法

方法也可以接受参数,以便在执行操作时使用外部传入的数据。例如,我们为Person类添加一个SetDetails方法,用于一次性设置姓名和年龄:

Public Class Person
    Public Name As String
    Public Age As Integer
    
    Public Sub SetDetails(ByVal newName As String, ByVal newAge As Integer)
        Name = newName
        Age = newAge
    End Sub
    
    Public Sub SayHello()
        MsgBox("Hello, my name is " & Name & " and I'm " & Age & " years old.")
    End Sub
End Class

调用该方法:

Dim p As New Person
p.SetDetails("Bob", 35)
p.SayHello()

3.2 方法的重载

方法重载是指在同一个类中,可以有多个同名的方法,但它们的参数列表不同(参数个数、类型或顺序不同)。 例如,我们为Person类添加另一个SetDetails方法,只接受姓名作为参数:

Public Class Person
    Public Name As String
    Public Age As Integer
    
    Public Sub SetDetails(ByVal newName As String)
        Name = newName
    End Sub
    
    Public Sub SetDetails(ByVal newName As String, ByVal newAge As Integer)
        Name = newName
        Age = newAge
    End Sub
    
    Public Sub SayHello()
        MsgBox("Hello, my name is " & Name & " and I'm " & Age & " years old.")
    End Sub
End Class

调用不同版本的SetDetails方法:

Dim p As New Person
p.SetDetails("Charlie")
p.SayHello()

p.SetDetails("David", 40)
p.SayHello()

四、Visual Basic 中的继承

4.1 继承的概念与语法

继承是面向对象编程的一个重要特性,它允许一个类(子类)从另一个类(父类)获取属性和方法。子类可以复用父类的代码,并且可以添加自己特有的属性和方法,或者重写父类的方法。 在 VB 中,使用Inherits关键字来实现继承。例如,我们创建一个Employee类继承自Person类:

Public Class Person
    Public Name As String
    Public Age As Integer
    
    Public Sub SayHello()
        MsgBox("Hello, my name is " & Name & " and I'm " & Age & " years old.")
    End Sub
End Class

Public Class Employee
    Inherits Person
    Public EmployeeID As String
    
    Public Sub DisplayEmployeeInfo()
        MsgBox("Employee ID: " & EmployeeID & ", Name: " & Name & ", Age: " & Age)
    End Sub
End Class

在上述代码中,Employee类继承了Person类的NameAge属性和SayHello方法,并且添加了自己的EmployeeID属性和DisplayEmployeeInfo方法。

4.2 重写方法

子类可以重写父类的方法,以提供不同的实现。在 VB 中,父类的方法需要使用Overridable关键字声明为可重写,子类使用Overrides关键字来重写该方法。 例如,我们在Person类中修改SayHello方法为可重写,并在Employee类中重写它:

Public Class Person
    Public Name As String
    Public Age As Integer
    
    Public Overridable Sub SayHello()
        MsgBox("Hello, I'm a person. My name is " & Name & " and I'm " & Age & " years old.")
    End Sub
End Class

Public Class Employee
    Inherits Person
    Public EmployeeID As String
    
    Public Overrides Sub SayHello()
        MsgBox("Hello, I'm an employee. My ID is " & EmployeeID & ", Name is " & Name & " and I'm " & Age & " years old.")
    End Sub
    
    Public Sub DisplayEmployeeInfo()
        MsgBox("Employee ID: " & EmployeeID & ", Name: " & Name & ", Age: " & Age)
    End Sub
End Class

调用重写后的方法:

Dim emp As New Employee
emp.Name = "Eve"
emp.Age = 28
emp.EmployeeID = "E001"
emp.SayHello()

五、Visual Basic 中的多态

5.1 多态的概念

多态是指同一个操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在 VB 中,多态主要通过继承和方法重写来实现。

5.2 实现多态的方式

5.2.1 通过对象引用实现多态

例如,我们创建一个包含Person对象和Employee对象的数组,并通过Person类型的引用调用SayHello方法:

Dim people(1) As Person
people(0) = New Person
people(0).Name = "Person1"
people(0).Age = 30

people(1) = New Employee
CType(people(1), Employee).EmployeeID = "E002"
CType(people(1), Employee).Name = "Employee1"
CType(people(1), Employee).Age = 35

For Each p As Person In people
    p.SayHello()
Next

在上述代码中,虽然people数组中的元素类型都是Person,但当调用SayHello方法时,会根据实际对象的类型(PersonEmployee)来执行相应的SayHello方法,这就是多态的体现。

5.2.2 通过函数参数实现多态

我们可以定义一个接受Person类型参数的函数,并在函数中调用SayHello方法。当传入不同类型(PersonEmployee)的对象时,会执行相应的方法。

Public Sub GreetPerson(ByVal p As Person)
    p.SayHello()
End Sub

'调用函数
Dim p1 As New Person
p1.Name = "Person2"
p1.Age = 25
GreetPerson(p1)

Dim emp2 As New Employee
emp2.EmployeeID = "E003"
emp2.Name = "Employee2"
emp2.Age = 28
GreetPerson(emp2)

六、Visual Basic 中的封装

6.1 封装的概念

封装是将数据(属性)和操作(方法)包装在一起,隐藏对象的内部实现细节,只向外部提供必要的接口。通过封装,可以保护对象的内部数据不被随意修改,提高代码的安全性和可维护性。

6.2 实现封装的方式

在 VB 中,通过使用访问修饰符(如PrivatePublicProtected)来实现封装。例如,前面Person类中的m_Age变量使用Private修饰,外部代码无法直接访问,只能通过Age属性的GetSet过程来间接访问和修改,这样就隐藏了m_Age的存储细节,并且可以在Set过程中添加验证逻辑。

另外,类的方法也可以作为外部访问类内部数据的接口。例如,SetDetails方法提供了一种方便的方式来设置NameAge属性,而外部代码不需要知道类内部是如何存储和处理这些数据的。

七、Visual Basic 中的事件驱动编程

7.1 事件的概念

事件是对象发出的通知,用于告知程序某个特定的事情发生了。例如,当用户点击按钮时,按钮对象会发出一个Click事件;当文本框中的文本发生变化时,文本框对象会发出一个TextChanged事件。

7.2 事件处理程序

事件处理程序是一段代码,用于响应对象发出的事件。在 VB 中,事件处理程序通常是一个方法,它的命名遵循一定的规则,一般是对象名加上下划线再加上事件名。 例如,为按钮的Click事件添加处理程序:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    MsgBox("You clicked the button!")
End Sub

在上述代码中,Button1_Click是事件处理程序的名称,Handles Button1.Click表示该方法处理Button1按钮的Click事件。

7.3 自定义事件

除了使用系统预定义的事件,我们还可以在类中定义自己的事件。例如,我们在Person类中定义一个AgeChanged事件:

Public Class Person
    Private m_Age As Integer
    
    Public Event AgeChanged(ByVal oldAge As Integer, ByVal newAge As Integer)
    
    Public Property Age() As Integer
        Get
            Return m_Age
        End Get
        Set(ByVal value As Integer)
            Dim oldAge As Integer = m_Age
            If value >= 0 And value <= 120 Then
                m_Age = value
                RaiseEvent AgeChanged(oldAge, value)
            Else
                MsgBox("Invalid age value.")
            End If
        End Set
    End Property
    
    '其他属性和方法保持不变
    Public Name As String
    
    Public Sub SayHello()
        MsgBox("Hello, my name is " & Name & " and I'm " & Age & " years old.")
    End Sub
End Class

然后在外部代码中处理这个自定义事件:

Private Sub HandleAgeChange(ByVal oldAge As Integer, ByVal newAge As Integer)
    MsgBox("Age changed from " & oldAge & " to " & newAge)
End Sub

Dim p As New Person
AddHandler p.AgeChanged, AddressOf HandleAgeChange
p.Age = 20
p.Age = 25

在上述代码中,首先定义了AgeChanged事件,在Age属性的Set过程中,当年龄发生变化时,通过RaiseEvent语句触发该事件。然后在外部代码中,使用AddHandler语句将HandleAgeChange方法与p对象的AgeChanged事件关联起来,这样当p对象的年龄发生变化时,就会调用HandleAgeChange方法。

通过深入理解和掌握 Visual Basic 面向对象编程的这些基础概念,开发者能够编写出更加结构化、可维护和可扩展的程序,充分发挥 VB 在 Windows 应用程序开发等领域的强大功能。无论是开发小型的桌面应用还是大型的企业级软件,这些概念都是构建稳固代码架构的基石。同时,不断实践和探索这些概念在实际项目中的应用,将有助于开发者提升自己的编程技能和解决复杂问题的能力。在实际编程过程中,还需要结合具体的业务需求和项目场景,合理运用这些面向对象的特性,以实现高效、优质的软件开发。例如,在一个企业级的人力资源管理系统中,可以利用继承和多态来处理不同类型员工(如全职员工、兼职员工等)的共性和特性;通过封装来保护员工数据的安全性;利用事件驱动编程来响应用户在界面上的各种操作,如员工信息的添加、修改和删除等。总之,熟练掌握 Visual Basic 面向对象编程基础概念是成为一名优秀 VB 开发者的必经之路。