面向对象编程若干思考 面向对象编程教学中重点与难点 黎升洪 2011.01
面向对象的系统观 基于面向对象的系统观认为, 一个系统是由若干对象和这些对象间的交互构造而成 面向对象系统观反映了基于面向对象的方法如何构造软件系统
OO 教学中的问题 对象非常多每个对象 属性非常多方法 ( 事件 ) 非常多 容易迷失在细节中 只见树木, 不见森林
面向对象编程分层 初级阶段 中级阶段 高级阶段
(1) 初级阶段 用户不用编写自己的类代码, 仅需将 Access 对象模型提供的类实例化为对象, 再编写这些对象间的交互部分的程序
初级阶段 2 初级阶段用户使用的类库是 Access 2007 的对象模型它提供了几乎所有的 Access 2007 界面构成元素的类库
初级用户操作 构造定制窗体的过程 是将相应的 ( 控件 ) 类实例化为对应 ( 控件 ) 对象的过程 编写代码的过程 描述多个对象间交互的过程 优点 编程简单 编写程序代码可靠性高
初级阶段特性 初级阶段的程序编写主要强调对象的 可标识性 这是编程引用对象的基础 自治性 状态性
(2) 中级阶段 中级阶段是在初级的基础上, 增加了用户自定义类, 但这个类不从其他类继承任何的属性和方法 ( 或事件 ), 它仅仅是一个简单的类 在这个阶段, 用户除了初级阶段工作, 还需要将自己编写的类先实例化为对象, 再引用该对象对应的属性和方法
(3) 高级阶段 高级阶段的工作是在中级阶段的基础上 增加的用户自定义类涉及从其他类继承了属性和方法 ( 或事件 )
类与对象之间的关系 类与类关类与对象关系系类可以实例化到多个对象 ; 类与类间为继承关系 多个对象抽象到一个类 对象与对象关系 对象与对象间是交互关系 对象间交互就是消息, 消息中引用对象属性和调用对象方法有严格格式
7. 面向对象编程过程 对于面向对象程序设计语言来说, 编写具备特定功能程序的过程大致分为三步 : (1) 根据给出的实际问题, 抽象出相关的名词术语, 再将这些名词变成该系统中的各个核心概念 类, 类封装了其代表核心概念的属性和方法 ( 或事件 ); (2) 将类实例化为对象 ; (3) 描述这些对象间的交互, 即这些对象间的消息关系 ( 教学重点内容 )
教学难点 如何阅读一个 OO 程序类与对象的区分对象属性引用格式对象方法 ( 事件 ) 调用格式
如何阅读一个 OO 程序 有哪些对象? 这些对象的名称是什么? 编写代码的重点 某个特定对象所属的类是什么? 使用帮助的重点 某个特定对象的哪些属性做了设置 某个特定对象的哪些方法 ( 事件 ) 编写了程序代码 某个特定对象的某个方法 ( 事件 ) 的功能
类与对象的区别 如何对 OO 中的类 对象进行区分? 相同部分 : 类 对象均是属性 方法 ( 事件 ) 的封装 不同部分 : 出现范畴不同 在分析阶段, 类 对象没有严格区分, 通常统称为对象 在编码阶段, 类 对象有严格区分 必须先编写类, 再实例化为对象, 最后编写对象交互
类或对象的区别 对象的可标识性 ( 类没有 ) 类或对象的封装性 对象的状态性 ( 类没有 ) 对象的自治性 ( 类没有 ) 类的继承性 ( 对象没有 ) 注意区分 : 类还是对象的特性, 或两者共有的特性
对象 对象是属性和方法 ( 或事件 ) 的封装体 VBA 包括 : 窗体 命令按钮 组合框等对象 这些对象用来构成与用户交互的界面元素
对象示意图
属性 属性通常用来控制控件的显示特性, 例如 标题 属性的取值为 确定, 决定命令按钮上显示的文字为 确定 命令按钮的 可用 属性决定命令按钮是否有效
命令按钮部分属性
3. 方法和事件 方法 ( 或事件 ) 是对象具有的某种处理功能, 在程序代码上表现为一个程序过程 例如学生 江华 的 注册学籍 选修课程 操作就是学生对象具有的方法
方法和事件不同之处 对象的方法调用是使用特定格式的显式调用 ( 请参见 9.2.4), 事件的调用方式是隐式的 即通常不存在一条语句来说明事件被调用 事件的调用或触发是由用户的操作来实现的, 这被称为事件驱动
事件例子 例如 : 命令按钮上存在鼠标的单击事件, 当用户使用鼠标指向该命令按钮并单击鼠标左键时, 将触发在命令按钮上单击事件中预先编写的代码
命令按钮具有的事件 通常一个对象包括很多事件, 命令按钮具有的事件
5. 消息 消息实现了对象间的交互 一个对象通过接口向外界公布其提供的属性和方法 ( 或事件 ), 其他对象通过发送一个特定的消息来与这个对象进行交互, 可能有结果返回到发送消息的对象, 也可能没有结果返回发送消息的对象 消息的描述除了和对象公布的属性和方法 ( 或事件 ) 有关外, 它还有特定的格式 有关 Access 2007 VBA 消息格式参请阅 9.2.4 节相关介绍
9.1.2 类或对象的特性 对象的可标识性 类或对象的封装性 对象的状态性 对象的自治性 类的继承性 注意区分 : 类还是对象的特性, 或两者共有的特性
对象的可标识性 每个对象实例都有标识自己的名称 (Name) 或标识号 ( 英语为 Identifier, 简写为 ID) 例如, 如果图章具有自动改变序号功能, 则每个实例化出来的图章印, 虽具有相同的属性和操作, 但它们具有不同的标识号 序号不同
对象可标识性示例 左侧选中的复选框名称为 Check0 名称 Check0 被用来标识左侧的复选框对象
2. 类或对象的封装性 类 ( 或对象 ) 的封装性表现在对象将属性和方法 ( 或事件 ) 封装在对象中 对象封装的好处是可以隐藏对象内部的实现细节, 即所谓的信息隐蔽原则, 也可以理解为黑箱 只关心它提供的功能, 不关心对象的功能是如何编写实现 可以杜绝由于某个对象的方法 ( 或事件 ) 改变对其他对象的影响, 通过独立的分治原则可以减低问题的复杂性
3. 对象的状态性 对象的状态性是通过给对象的属性赋值来表现的 即对象的取值不同, 对象就处于不同状态 例如, 学生 江华 对象 这里类为 学生, 类 学生 的姓名属性值为 江华
4. 对象的自治性 由于对象是属性和方法 ( 或事件 ) 的封装体 对象状态的改变是由该对象自身实施的 即其他对象通过发送消息, 请求一个对象改变其状态, 该对象的状态是否改变取决于该对象当前的状态, 在某些状态下可能无法改变该对象的状态, 这称为对象的自治性
5. 类的继承性 面向对象的概念中, 已经讨论了类与对象间的关系, 类与类之间是否存在关系呢? 在语义上, 一个类与另一个类之间可能存在类继承关系
类继承的例子 父类 子类 子类继承了父类的所有属性和方法 ( 或事件 )
对象属性设置与方法引用 一个事件中的代码功能包括 : 修改某个对象属性值调用另一个对象的方法 ( 或事件 ) 重点是属性引用或方法调用格式
对象属性设置与方法引用 2 对象名称属性的取值被用来标识这些对象, 并且所有这些对象的标识名称是唯一的 这些对象具有自己的属性和方法 ( 或事件 )
对象属性设置与方法引用 3 面向对象编程中, 对象间交互的程序编写, 就是修改 ( 设置 ) 对象属性值或者调用对象编写了代码的方法 ( 或事件 ) 编写程序中引用 ( 或设置 ) 对象的属性格式及调用对象方法 ( 或事件 ) 格式均具有特定格式要求 这称为对象属性 方法 ( 或事件 ) 引用方式
(1) 使用集合对象引用窗体 ( 控件 ) 属性和方法 Access 对象模型中对象间除了具有 层次关系对象又可以分为集合对象和单个对象 要引用对象属性 ( 或方法 ) 对象名称扮演了非常重要的角色
Access 对象模型 是系统提供的库 它是编程接口 有两种属性设置与方法调用方式 基于 Application 的方法 基于 Me 的方法
属性设置与方法调用总结 对象属性设置格式为 : Application.< 上一级 ( 集合 ) 对象 >!< 下一级 ( 集合 ) 对象 >. 属性名 = 值分隔符 (!) 和分隔符 (.) 反映层次关系两者均读为 ( 的 )
属性设置与方法调用总结 对象方法 ( 或事件 ) 调用格式为 : Application.< 上一级 ( 集合 ) 对象 >!< 下一级 ( 集合 ) 对象 >. 方法 ( 或事件 )
感叹号 (!) 和点 (.) 的区别 & 注意 : 由于 VBA 使用感叹号 (!) 和点 (.) 来均可用来引用对象的属性或控件对象, 不混淆这两个符号使用的一般方法是 : 凡 Access 系统命名的名称, 请使用点 (.) 符号来引用它 ; 凡编程人员命名名称的对象, 请使用感叹号 (!) 符号来引用它 设置窗体属性或控件属性时, 请使用点 (.) 而引用窗体中的控件时, 请使用感叹号 (!)
Access 对象模型中的集合对象 一个集合对象中, 含多个对象
集合对象方法引用 引用方式 Forms(0) Forms("Form _Name") Forms!Form_ Name 引用含义 使用下标方式引用集合中的对象 使用窗体名称方式引用集合中的对象 这里 Form_Name 可以使用 [ ] 括起 使用运算符! 方式引用集合中的对象, 这里 Form_Name 可以使用 [ ] 括起
基于 Application 对象设置属性的说明 语句与 Access 对象模型对应关系 Application. Forms![ 例 9-1 面向对象程序设计示例一 ]. Controls("Check0"). Enabled = true 部分 Access 对象模型注意 : 左图仅为对象不含属性和方法
具体说明 我们后面的例子均在程序中设置窗体或控件属性和方法 ( 或事件 ) (1) 引用 Access 对象模型中的顶级对象 Application (2) 语句 Application.Forms![ 例 9-1 面向对象程序设计示例一 ] 表示引用窗体集合中的 [ 例 9-1 面向对象程序设计示例一 ] 窗体
具体说明 2 (3) 语句 Application.Forms![ 例 9-1 面向对象程序设计示例一 ].Controls![Check0] 表示引用 [ 例 9-1 面向对象程序设计示例一 ] 窗体中控件集合中的 [Check0] 控件 (4) 语句 Application.Forms![ 例 9-1 面向对象程序设计示例一 ]. Controls![Check0].Enabled = false 表示将控件 [Check0] 的 可用 属性置为 False
Access 对象的属性数据设置有两种 方法 : (1) 在设计时刻设置属性, 即选中需设定属性的对象, 再通过属性对话框直接修改属性值 ; (2) 通过程序编写来设置对象属性值, 即程序运行时设置对象属性
基于 Me 的窗体 控件属性设置 VBA 窗体属性设置的格式 : Me.< 属性名 > = 值 VBA 控件属性设置的格式 : Me!< 控件名 >.< 属性名 > = 值
基于 Me 的方法 事件引用 VBA 窗体方法 ( 或事件 ) 调用一般格式 : Me.< 方法 ( 或事件 )> VBA 控件方法 ( 或事件 ) 调用一般格式 : Me!< 控件名 >.< 方法 ( 或事件 )>
(2) 使用关键字 Me 引用窗体 ( 控 件 ) 属性和方法 关键字 Me 在 Access VBA 中是非常特殊的关键字, 它表示当前代码正在运行窗体或报表 例如, 窗体 frmbusiness 中有程序代码, 则任何时候只要在这些程序代码中使用关键字 Me, 就可以得到对 frmbusiness 的引用 即 Me 关键字省略了从最顶级对象 Application 直到 Forms( 或 Reports) 间的所有对象,
VBA 面向对象编程控件示例 例 9-4 组合框示例 (1) 构造界面 (2) 设置控件名称 (3) 设置控件属性 (4) 编写代码 (5) 运行程序, 查看结果
例 9-4 (1) 构造界面
例 9-4 (2) 设置控件名称 界面元素 控件名称 标签 请选择组合框中的条目 : Label1 标签 你选择的结果在这里 组合框 Label2 Cbo 组合框 注意 : 由于窗体界面中, 标签仅起信息提示作用, 只需将其标题 (Caption) 属性改为界面提示字符串即可, 在后面的例子中不再给出标签的控件名称和属性设置
例 9-4 (3) 设置控件属性 控件名称 Cbo 组合框 属性 列数 2 绑列 定 设置值 2 说明 表示组合框中有两列, 其中第一列用来存放显示给用户的提示信息, 第二列用来存放实际存储的数据 表示第二列为实际存储的数据, 它可以通过 Value 属性取得
例 9-4 (3) 设置控件属性 2 控件名称 Cbo 组合框 属性设置值说明 行源型 来类 值列表 本例中是用户输入的数据, 故取 值列表 如果从数据表中取得数据, 则设置为 字段列表 或 表 / 查询 行 来 " 第一个数值 ";11; 行来源属性指定了组合框 源 " 第二个数值 ";12 条目取值, 这里共 2 个, 每个条目有两列 列宽 2.5cm; 2.5cm 用来指定条目 2 列的宽度
例 9-4 (4) 编写代码 对组合框的 Chang( 更改 ) 事件编写代码 功能是设置 Label2 的 标题 属性 Private Sub Cbo 组合框 _Change() Me.Label2.Caption = Me.Cbo 组合框.Value End Sub
例 9-4 (5) 运行程序, 查看结 果 本例中组合框中的条目是通过 值列表 方式加入的, 下面使用组合框的 Additem 方法来加入条目
例 9-5 组合框例子 使用 AddItem 方法加入条目的组合框例子 (1) 构造界面 (2) 控件名称 (3) 控件属性设置 (4) 代码编写 (5) 运行程序
例 9-5 (1) 构造界面
例 9-5 (2) 控件名称 界面元素 控件名称 标签 使用 AddItem 增加条目的例子 : 组合框 Label Cbo 组合框
例 9-5 (3) 控件属性设置 控件名称 Cbo 组合框 属性 列数 2 绑定列 2 行来源类型 设置值 值列表 说明 表示组合框中有两列, 其中第一列用来存放显示给用户的提示信息, 第二列用来存放实际存储的数据 表示第二列为实际存储的数据, 它可以通过 Value 属性取得本例中是用户输入的数据, 故取 值列表 如果从数据表中取得数据, 则设置为 字段列表 或 表 / 查询
例 9-5 (4) 代码编写 对窗体的 Load( 载入 ) 事件编写代码 Private Sub Form_Load() ' 使用循环构造 10 个条目, 每个条目有两列, ' 绑定列 属性设置为第 2 列 Dim i As Integer For i = 1 To 10 Me.Cbo 组合框.AddItem " 第 " & Trim(Str(i)) & " 个条目显示 ;" & Str(i) ' 符号 ; 用来分割两列的数值 Next Me.Cbo 组合框.DefaultValue = Me.Cbo 组合框.ItemData(5) ' 选中第六个条目, 计数从 0 开始 End Sub
例 9-5 (4) 代码编写 2 组合框的 AddItem 方法 追加条目到组合框 组合框.DefaultValue 属性 设置默认的条目 组合框.ItemData(5) 属性 取得组合框某个条目的值
谢谢! 请指正 黎升洪 2011.01