第6章 LabVIEW面向对象程序设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
“大四学生” 类中获取成绩 的程序框图
Http://ccms.hust.edu.cn
18
6.3LabVIEW对象基本实现
创建重写成员VI
重写成员VI是对祖先类中动态VI的重写,必须与祖先类 中的同名成员VI具有相同的重入设置、首选执行设置、 优先级设置、连线板接线端、连线板模式和访问范围; 创建重写成员VI时,LabVIEW会自动调用父类方法的节 点、动态输入和输出类接线端及其他匹配祖先类VI所需 的接线端并放置在程序框图中; 当选择创建时若不存在可重写的祖先类成员VI, LabVIEW将禁用重写成员VI的选项。
在LabVIEW的面向对象编程中,构造和析构是隐含的, 不需要用户编写或调用。
Http://ccms.hust.edu.cn
26
6.4LabVIEW对象高级技巧
内存分布
在LabVIEW中,类的高效存储是一个挑战性的问题。 一个类的数据包括从父类继承来的数据簇和自身的私有 数据簇。
Http://ccms.hust.edu.cn
Http://ccms.hust.edu.cn
19
6.3LabVIEW对象基本实现
右击“保研生”类,选择“新建”下拉列中的“用于重 写的VI”,会出现一个提示框用于选择需要重写的动态 VI。我们选择“大四学生”类下的“获取成绩.vi”, LabVIEW会自动生成一个“保研生”类下的“获取成绩 .vi”。
类中的每个对象都是该类的对象实例,系统运行时通过 类定义属性初始化可以生成该类的对象实例。
Http://ccms.hust.edu.cn
3
6.1面向对象
属性与方法的概念
对象是属性及方法的封装体; 对象的属性是指描述对象的数据,这些数据可以是系统 或用户定义的数据类型,也可以是一个对象的数据类型 ; 对象的方法是指定义在对象属性上的一组操作的集合; 方法是为响应消息而完成的算法,表示对象内部实现的 细节,对象方法集合体现了对象的行为能力;
Http://ccms.hust.edu.cn
8
6.2LabVIEW与面向对象程序设计
多态
多态性表现有两种,即编译时的多态性和运行时的多态性 。编译时的多态性是用函数的重载来实现的,运行时的 多态性是用虚函数来实现的,而这两种方式在LabVIEW 的类中都没有实现。 首先,LabVIEW类不支持重载,但这种多态性的思想在 LabVIEW的早期版本中就一直存在并发挥着重要作用, 主要表现为多态的函数、VI和单位; 其次,对于虚函数而言,“虚拟”和“虚拟分配”的概 念在LabVIEW中也面临一些问题,LabVIEW面向对象编程 选择了“动态”和“动态分配”来代替这两个术语。
Http://ccms.hust.edu.cn
6
6.2LabVIEW与面向对象程序设计
继承
LabVIEW在实现继承特性时坚持这样一条原则:LabVIEW 用户能够实现类的继承,可以选择一个已有类作为父类 ,创建一个子类,并且可以覆盖父类中的方法; LabVIEW提供了(Object)类,作为所有LabVIEW类的祖 先; LabVIEW目前只支持公共继承,而不支持私有继承和多 继承。
Http://ccms.hust.edu.cn
9
6.3LabVIEW对象基本实现
创建类
通过菜单“File→New→Class”或者在项目浏览器的右 键快捷菜单中选择“New→Class”项,都可以创建 LabVIEW类; 创建类时,LabVIEW将创建一个新的类库文件( .lvclass),该文件可以记录类的私有数据控件( Private Data Control)和所有被创建的成员VI的信息 ,包括VI列表及VI的属性等; 类的数据被定义在私有数据控件中,私有数据控件是一 个数据簇,与类库文件是一一对应的,并保存在类库文 件中,私有数据控件的名称以“.ctl”作为扩展名。
Http://ccms.hust.edu.cn
5
6.2LabVIEW与面向对象程序设计
LabVIEW引入面向对象编程时的术语
LabVIEW依然使用家族关系术语:父与子、兄弟与堂兄 弟等,这些都是用户已经熟悉的术语,当提到某个类的 父类时,都可以理解这两个类之间的关系; LabVIEW类成员的限定性术语:依然采用“私有的”、 “共有的”和“受保护的”等词汇。
21
6.3LabVIEW对象基本实现
动态分派程序
在编写程序时,动态成员VI在程序背面板上就像一般的子 VI一样,不过当运行时,输入端口传递进来的数据就决 定了调用哪个类中的成员VI。
Http://ccms.hust.edu.cn
22
6.3LabVIEW对象基本实现
访问范围设置
LabVIEW类只包含私有成员数据,但可以为类的成员VI指 定访问范围。成员VI的访问范围选项包含如下设置: a) 公共(Public),任何VI都可以调用该成员VI; b) 保护(Protected),仅该成员VI所在类及其子类中的 VI可以调用该成员VI,在项目浏览器窗口中受保护的成 员VI图标中有一个暗黄色的钥匙符号; c) 私有(Private),仅该成员VI所在类中的VI可以调用 该成员VI,在项目浏览器窗口中私有型的成员VI图标中 有一个红色的钥匙符号。
更改后的 继承关系
Http://ccms.hust.edu.cn
15
6.3LabVIEW对象基本实现
创建方法
在类名称上右击,选择需要创建VI的类型:普通成员VI、动态 成员VI或重写VI(Override VI)。
Http://ccms.hust.edu.cn
16
6.3LabVIEW对象基本实现
LabVIEW面向对象程序设计
Intelligent Electronics Institute Huazhong University of Science & Technology
目录
面向对象 LabVIEW与面向对象程序设计
LabVIEW对象基本实现
LabVIEW对象高级技巧
实例介绍
提示与建议
私有数 据成员
Http://ccms.hust.edu.cn
12
6.3LabVIEW对象基本实现
设置继承
在LabVIEW中,通过“继承”可在现有类的基础上创建 一个新类; 当一个新类被设置为继承另一个LabVIEW类时,这个新 类就可以使用它所继承的类中“公共”及“保护”型的 成员VI; 在LabVIEW中,所有的类都默认继承LabVIEW Object的 基本类。
Http://Hale Waihona Puke Baiducms.hust.edu.cn
10
6.3LabVIEW对象基本实现
私有数据控件示例
类库文件中的 私有数据控件
Http://ccms.hust.edu.cn
11
6.3LabVIEW对象基本实现
编辑私有数据成员
在项目浏览器窗口双击类的私有数据控件,可以对类中的数据成 员进行编辑,将需要的控件放置到该类的定义私有数据控件中 ,作为类私有数据簇中的成员。
习题
Http://ccms.hust.edu.cn
2
6.1面向对象
对象与类的概念
对象是系统中用来描述客观事物的一个实体,是构成系 统的基本单位,由属性和对这些属性进行的操作等构成; 类是对象的抽象及描述,是具有共同属性和操作的多个 对象的统一描述体,类也是对象,是一种集合对象;
在类的描述中,每个类要有一个名字,要表示一组对象 的共同特征,还必须给出一个生成对象的实例的具体方法;
对象的属性和方法是对象定义的组成要素,它们统称为 对象的特征。
Http://ccms.hust.edu.cn
4
6.1面向对象
面向对象中的三要素:
封装 继承
多态
在面向对象的程序设计中,封装就是把相关的数据和代码结合 成一个有机的整体,形成数据和操作代码的封装体,对外只提 供一个可以控制的接口,内部大部分的实现细节对外隐蔽,达 到对数据访问权的合理控制;
Http://ccms.hust.edu.cn
7
6.2LabVIEW与面向对象程序设计
封装
LabVIEW实现了类的封装,但对封装特征进行了选择; LabVIEW类只包含对私有数据的支持,不提供公共数据 和受保护的数据两种属性; LabVIEW类中的方法,不仅可以是私有的,还可以是公 共的或受保护的。
27
6.4LabVIEW对象高级技巧
在类实现时,LabVIEW需要为一个类分配数据空间
Http://ccms.hust.edu.cn
28
6.4LabVIEW对象高级技巧
动态分配
动态分配是LabVIEW的一个特色,一个看似单个VI调用 的节点在运行时实际上调用的是一组VI中的某个,这取 决于运行时动态分配输入端连线上的值; 每一个在连线上传递的对象都含有指向其类信息的指针 ,这个类信息包含了一个“动态分配表”,它是一个VI 引用表; 每个类首先复制了其父类的动态分配表,同时它用自身 重写的VI方法替换父类中对应的方法,然后将没有重写 的父类动态分配VI添加到表中。
新建静态成员VI
新建静态成员VI后,会打开一个空面板的VI, 用户可以根据应用需要添加程序代码;
静态方法只有单个VI,在子类中无法创建与父 类静态成员VI相同名称的成员VI。
Http://ccms.hust.edu.cn
17
6.3LabVIEW对象基本实现
新建动态成员VI
新建动态成员VI后,会打开一个含有部分代码的VI,其中包括 错误输入簇、错误输出簇、用于错误处理的条件结构,以及输 入LabVIEW类和输出LabVIEW类; 动态成员VI主要出现在具有继承关系的LabVIEW类中,只有当 子类需要继承并重写父类中的某些VI时,这些VI才有必要设置 为动态成员VI。
“保研生”类 中获取成绩的 程序框图
Http://ccms.hust.edu.cn
20
6.3LabVIEW对象基本实现
输入或输出接线端
对于动态VI,右键单击连线板上的输入或输出接线端,会发现其 连接为动态分配模式。
“保研生”类 中获取成绩的 输入端口
Http://ccms.hust.edu.cn
Http://ccms.hust.edu.cn
13
6.3LabVIEW对象基本实现
设置继承示例
默认继 承关系
Http://ccms.hust.edu.cn
14
6.3LabVIEW对象基本实现
改变类的继承关系
在类名称上右击,进入属性设置对话框,选择“继承”(Inheritance), 然后单击“更改继承”(Change Inheritance),可改变类的继承关 系。
在面向对象程序设计中,继承表达的是类之间的关系,这种关 系使得一个类可以继承另一类的属性和方法,从而提供了通过 现有的类创建新类的方法,也提高了软件复用的程度; 多态是面向对象程序设计的重要特性之一,是指不同的对象收 到相同的消息时产生不同的操作行为,或者说同一个消息可以 根据发送消息的对象的不同而采用多种不同的操作行为。
Http://ccms.hust.edu.cn
23
6.3LabVIEW对象基本实现
在类上右击,选择属性后可以设置一个VI的访问范围
Http://ccms.hust.edu.cn
24
6.3LabVIEW对象基本实现
使用类
在创建LabVIEW类的实例时,用户可直接将这个类的类库文件 (.lvclass)作为控件或常量放置在相应程序的前面板或程序 框图中; 在LabVIEW类中,所有的私有数据被定义为一个簇,通过在成 员VI的程序框图中调用函数来访问和操作这些数据; 对LabVIEW类进行捆绑或解除捆绑时,节点上仅显示当前类私 有数据的接线端,而不显示从父类继承的数据的接线端。
使用类获取大一成绩程序框图
Http://ccms.hust.edu.cn
25
6.4LabVIEW对象高级技巧
构造函数与析构函数
在一般的面向对象程序设计语言中,对象在创建和销毁 时会自动调用两个函数:构造函数和析构函数;
构造函数的作用是在对象被创建时利用特定的值构造对 象,将对象初始化为一个特定的状态,使对象具有自己 的特征; 析构函数则用来完成对象被删除前的一些清理工作,析 构函数调用完成之后,对象将被销毁,相应的内存空间 也被释放;