第九章 面向对象程序设计
第一节 类与对象的基础概念
概述
面向对象程序设计(Object-Oriented Programming, OOP)是现代软件开发的主流范式,其核心思想是通过“类”和“对象”来模拟现实世界的实体及其行为。Visual Basic作为一种支持面向对象编程的语言,理解类与对象的基本概念是学习面向对象程序设计的前提。本节内容将系统讲解类与对象的定义、结构、创建及使用方法,帮助考生深入掌握Visual Basic中面向对象编程的基础,为后续学习继承、多态等高级特性打下坚实基础。
学习目标:
- 理解类和对象的基本概念及其在程序设计中的作用
- 掌握Visual Basic中类的定义、成员的声明和访问方式
- 学会创建和使用对象,以及对象的生命周期管理
- 通过实例分析加深对类与对象的理解
- 识别常见误区,避免编程错误
核心概念
1. 类(Class)
类是面向对象编程中的一个基本单位,是对现实世界中具有相同特征和行为的一类事物的抽象。类是对象的蓝图或模板,定义了对象的属性(数据成员)和方法(成员函数)。
2. 对象(Object)
对象是类的具体实例,是根据类创建的具体实体。每个对象都有类定义的属性和方法,通过对象可以访问和操作这些属性和方法。
3. 属性(Property)
属性表示对象的状态或数据,是类中的变量成员。属性通常包括字段和属性过程(Property Let/Get)来实现访问控制。
4. 方法(Method)
方法是类中的函数或子过程,用于定义对象能够执行的操作或行为。
5. 封装(Encapsulation)
封装是面向对象设计的基本原则之一,它将数据和操作数据的代码绑定在一起,并对外隐藏内部实现细节,提高程序的安全性和可维护性。
原理分析
面向对象编程的核心是把现实世界的实体抽象成类,并通过类创建对象操作现实中的事物。Visual Basic中类的实现机制包括:
- 类定义:通过
Class...End Class结构定义类,类中包含属性和方法。 - 对象创建:使用
Dim obj As New ClassName或先声明再使用Set obj = New ClassName创建对象。 - 成员访问:通过对象名
.成员名访问属性和方法。 - 生命周期管理:对象在创建后占用内存空间,使用完毕后应释放(
Set obj = Nothing),避免内存泄漏。
这种机制使得程序结构更清晰,代码重用性更高,开发效率更快。
详细内容
1. 类的定义和结构
在Visual Basic中,类通过Class语句块定义,基本结构如下:
Class 类名
' 成员变量(字段)
' 属性定义
' 方法定义
End Class
- 成员变量:用于存储对象的状态信息,通常声明为私有(Private)以实现封装。
- 属性(Property):通过
Property Let和Property Get过程实现对成员变量的访问和修改。 - 方法(Sub或Function):定义对象的行为。
示例:
Class Person
Private m_Name As String
Private m_Age As Integer
' 设置姓名属性
Public Property Let Name(ByVal value As String)
m_Name = value
End Property
' 获取姓名属性
Public Property Get Name() As String
Name = m_Name
End Property
' 设置年龄属性
Public Property Let Age(ByVal value As Integer)
m_Age = value
End Property
' 获取年龄属性
Public Property Get Age() As Integer
Age = m_Age
End Property
' 显示个人信息方法
Public Sub ShowInfo()
MsgBox "姓名:" & m_Name & ", 年龄:" & m_Age
End Sub
End Class
2. 对象的创建与使用
创建对象的两种常用方式:
- 声明并实例化同时进行
Dim p As New Person
- 先声明变量,后实例化
Dim p As Person
Set p = New Person
对象创建后,可以通过.操作符访问其属性和方法:
p.Name = "张三"
p.Age = 25
p.ShowInfo() ' 弹出显示姓名和年龄
3. 封装的实现
封装通过将成员变量声明为Private,并通过Public的Property过程来访问和修改,实现对数据的保护。例如,年龄属性可以在Property Let中增加验证逻辑,确保年龄合理:
Public Property Let Age(ByVal value As Integer)
If value >= 0 And value <= 150 Then
m_Age = value
Else
MsgBox "输入年龄无效!"
End If
End Property
4. 类的构造与析构
Visual Basic类中可以定义Class_Initialize过程作为构造函数,用于在创建对象时执行初始化操作。
Private Sub Class_Initialize()
m_Name = "未命名"
m_Age = 0
End Sub
析构过程Class_Terminate用于对象销毁时清理资源。
Private Sub Class_Terminate()
' 释放资源代码
End Sub
5. 访问修饰符
- Public:成员对所有代码可见
- Private:成员仅在类内部可见,实现封装
- Friend(仅限VB6):同一项目中可见
合理使用访问修饰符是设计良好类的关键。
实例分析
案例一:学生类的设计与使用
背景:设计一个学生类,包含学号、姓名和成绩属性,并实现显示信息和成绩判断功能。
代码示例:
Class Student
Private m_ID As String
Private m_Name As String
Private m_Score As Double
Public Property Let ID(ByVal value As String)
m_ID = value
End Property
Public Property Get ID() As String
ID = m_ID
End Property
Public Property Let Name(ByVal value As String)
m_Name = value
End Property
Public Property Get Name() As String
Name = m_Name
End Property
Public Property Let Score(ByVal value As Double)
If value >= 0 And value <= 100 Then
m_Score = value
Else
MsgBox "成绩必须在0到100之间"
End If
End Property
Public Property Get Score() As Double
Score = m_Score
End Property
Public Sub ShowInfo()
MsgBox "学号:" & m_ID & vbCrLf & _
"姓名:" & m_Name & vbCrLf & _
"成绩:" & m_Score
End Sub
Public Function IsPass() As Boolean
IsPass = (m_Score >= 60)
End Function
End Class
分析:
- 使用Private成员变量保护数据
- 通过Property过程控制数据有效性
- 提供功能方法判断是否及格
结论:合理定义类结构,保证数据安全与功能完整。
案例二:图书类管理系统
背景:设计图书类,包含书名、作者、价格属性,实现显示和打折功能。
代码示例:
Class Book
Private m_Title As String
Private m_Author As String
Private m_Price As Currency
Public Property Let Title(ByVal value As String)
m_Title = value
End Property
Public Property Get Title() As String
Title = m_Title
End Property
Public Property Let Author(ByVal value As String)
m_Author = value
End Property
Public Property Get Author() As String
Author = m_Author
End Property
Public Property Let Price(ByVal value As Currency)
If value >= 0 Then
m_Price = value
Else
MsgBox "价格不能为负"
End If
End Property
Public Property Get Price() As Currency
Price = m_Price
End Property
Public Sub ApplyDiscount(ByVal rate As Double)
If rate > 0 And rate < 1 Then
m_Price = m_Price * rate
Else
MsgBox "折扣率应在0和1之间"
End If
End Sub
Public Sub ShowInfo()
MsgBox "书名:" & m_Title & vbCrLf & _
"作者:" & m_Author & vbCrLf & _
"价格:" & FormatCurrency(m_Price)
End Sub
End Class
分析:
- 通过方法实现价格调整
- 类型Currency用于金额,保证精度
结论:类设计应考虑数据类型和业务需求。
案例三:简单银行账户类
背景:设计账户类,包含账号、余额属性,方法包括存款、取款和查询余额。
代码示例:
Class BankAccount
Private m_AccountNumber As String
Private m_Balance As Double
Public Property Let AccountNumber(ByVal value As String)
m_AccountNumber = value
End Property
Public Property Get AccountNumber() As String
AccountNumber = m_AccountNumber
End Property
Public Property Get Balance() As Double
Balance = m_Balance
End Property
Public Sub Deposit(ByVal amount As Double)
If amount > 0 Then
m_Balance = m_Balance + amount
Else
MsgBox "存款金额必须为正"
End If
End Sub
Public Sub Withdraw(ByVal amount As Double)
If amount > 0 And amount <= m_Balance Then
m_Balance = m_Balance - amount
Else
MsgBox "余额不足或金额无效"
End If
End Sub
Public Sub ShowInfo()
MsgBox "账号:" & m_AccountNumber & vbCrLf & _
"余额:" & m_Balance
End Sub
End Class
分析:
- 封装余额,禁止外部直接修改,必须通过存取方法
- 验证存取金额有效性
结论:封装保护数据安全,方法控制业务规则。
常见误区
误区:直接使用Public变量而不封装
- 错误做法:将类成员变量声明为Public,外部代码可以随意修改,导致数据不安全。
- 正确做法:使用Private变量配合Property过程控制访问权限和数据有效性。
误区:忽略对象的释放
- 错误做法:创建对象后不进行释放,导致内存泄漏。
- 正确做法:使用完对象后通过
Set 对象 = Nothing释放资源。
误区:在Property Let中未做数据验证
- 错误做法:直接赋值,可能导致数据异常。
- 正确做法:在Property Let中加入有效性判断,保证数据合理。
误区:混淆类和对象的概念
- 错误做法:将类理解为对象,忽视类是模板,对象是实例。
- 正确做法:明确类是定义,创建对象才是具体实例。
误区:构造函数未初始化成员变量
- 错误做法:创建对象时未对成员变量赋初值,导致程序异常。
- 正确做法:利用
Class_Initialize过程初始化成员。
应用场景
学生信息管理系统
- 通过定义学生类,封装学生的学号、姓名、成绩等信息,方便统一管理和操作。
图书馆书籍管理
- 使用图书类描述书籍属性,实现借阅、归还和库存管理等功能。
银行账户管理
- 设计账户类,控制余额的存取操作,确保资金安全。
企业员工档案管理
- 员工类封装员工的基本信息和职位,便于查询和维护。
游戏中的角色和物品建模
- 通过类定义游戏角色和道具,管理属性和行为,支持复杂的游戏逻辑。
知识拓展
- 继承(Inheritance):类可以从已有类派生,继承其属性和方法,实现代码复用和扩展。
- 多态(Polymorphism):不同类的对象对同一消息做出不同响应,提高程序灵活性。
- 接口(Interface):定义类必须实现的协议,保证不同类之间的协作。
- 抽象类和抽象方法:用于定义通用接口,具体实现由子类完成。
- 设计模式:如单例模式、工厂模式等,基于类与对象的设计理念,提升程序设计质量。
总结回顾
本节围绕Visual Basic中的面向对象编程基础展开,重点介绍了类与对象的概念、类的结构、对象的创建与使用及封装机制。
- 类是对象的蓝图,定义了属性和方法。
- 对象是类的实例,通过对象访问类成员。
- 封装实现数据保护,通过Private修饰符和Property过程控制访问。
- 构造与析构过程保证对象生命周期管理。
- 结合实例深入理解如何设计类、创建对象以及运用封装原则。
- 识别并避免常见误区,确保代码健壮性和可维护性。
掌握本节内容是理解面向对象程序设计的基础,对于全国计算机等级考试二级Visual Basic语言程序设计科目的考试复习具有重要意义。考生应结合实际编程练习,深化理解,灵活应用。