当前位置:首页 > 技能相关 > PowerBuilder > 正文内容

PowerBuilder 对象与结构 下

admin3年前 (2022-01-25)PowerBuilder3080 修订时间:2023-11-02 15:41:04

一、结构体

    结构体指使用一个名字的一组变量(有时称为元素),它可以包括一个或多个变量,这些变量可以是标准数据类型、对象或者结构体。

    当在结构体画板或其他画板(如窗口画板、菜单画板)中创建一个结构体时,也就定义了一个结构体。

    要想使用它,用户需要先做说明。在说明时,该结构体的事例被自动生成。当超出该结构体变量的可见范围时,系统会自动释放该变量。

    如果在结构体画板中定义了一个全局(Global)性结构体,则可以在任一脚本中说明该结构体,也可以说明该结构体为任何对象的实例变量,如果在一个对象画板中定义了该结构体,则只能在该对象内部说明该结构体的实例。

    下例中说明了 str_emp_data 的两个实例:

str_emp_data str_emp1, str_emp2

    在脚本中,可以使用点操作符引用结构体变量,格式如下:

structurename.variable

    例如:

str_emp1.emp_id=100 
    str_emp1.emp_lname="李明"

    如果结构体说明为对象的一部分,需要使用如下格式:

objectname.structurename.variable

    例如:

This.str_cust1.name 
w_customer.str_cust1.name

二、行为类似于结构体的用户对象

    非可视用户对象可以提供与结构体类似的功能。它的实例变量组成了一个类似于结构体的数据集合。在脚本中,我们可以使用点操作符引用用户对象中的实例变量,就像引用结构体中的变量那样。

    用户对象可以包含函数和私有的结构体,这些是结构体定义所不具有的。而且,用户对象允许从父对象继承。

    用户对象和结构体的内存使用方法不一样。对象的变量是对象的引用,说明变量并不为对象分配内存。

    在说明后,必须使用 CREATE 将其实例化。用户对象变量的赋值也与结构体的不同。

    如果希望使用一个包含方法和继承特性的用户对象,又希望它像结构体一样使用内存,可以定义一个自动实例化(autoinstantiated)对象。

    定义自动实例化对象的方法是:在用户对象画板中,单击鼠标右键,在弹出的菜单中使 Autoinstantiate选项处于选中状态。

    用户不必亲自实例化和清除自动实例化对象,自动实例化对象可以像结构体那样在说明时创建,在超出其可见范围后被释放。不过由于自动实例化对象行为像结构体,所以不利于使用该对象的多个副本。

三、为对象和结构赋值

    为对象赋值与结构体和自动实例化对象不同。当把一个结构体赋给另一个时,整个结构被拷贝,所以这时存在该结构体的两个实例。当对象变量之间赋值时,仅仅复制对象引用,所以两个变量指向同一个对象实例。

    说明结构体变量时就创建该结构体的实例。

str_emp_data str_emp1, str_emp2 // 两个结构体实例

    当结构体变量赋值时,复制整个结构体,因而有两个结构体实例存在。

str_emp1=str_emp2

结构体变量赋值的限制:赋值只能在相同结构体之间,即便两个结构体具有相同的结构,也不可以进行赋值,例如:

str_emp str_person1 
str_cust str_person2 
str_person1=str_person2 // 不允许

    说明对象变量是对对象引用的说明:

uo_emp_data uo_emp1,uo_emp2 // 两个引用

    然后,需要使用 CREATE 语句实例化:

uo_emp1=CREATE uo_emp_data

    当对象变量赋值时,只有对象实例的引用被复制,实例仅有一个:

uo_emp2=uo_emp1 // 指向同一个对象实例

    父对象和子对象之间的复制也与此类似进行——只有引用被复制。假设 uo_emp_data 是 uo_emp_active和 uo_emp_inactive 的父对象。现在说明父对象的变量:

uo_emp_data uo_emp1,uo_emp2

    创立子对象的实例并把它保存在父对象的变量中:

uo_emp1=CREATE USING "uo_emp_active"

    把 uo_emp1 赋给 uo_emp2,使它们都指向同一子对象 uo_emp_active 的实例:

uo_emp2=uo_emp1

    就像结构体那样,自动实例化对象在说明时自动创建该对象实例,因而对自动实例化对象不能使用CREATE 语句,下面例子中 uo_emp_data 具有 Autoinstantiate 设置:

uo_emp_data uo_emp1,uo_emp2 // 两个对象实例

    当对自动实例化对象赋值时,整个对象被复制,所以此时存在该对象的两个相同的实例:

uo_emp1=uo_emp2

    但是,不能多个变量引用同一个自动实例化对象。

    使用与结构体类似的方式传递自动实例化对象给函数:

     • 复制传递

     • 引用传递——像标准数据类型一样,传递对象的指针

     • 作为只读对象拷贝传递

    复制的限制:自动实例化对象变量相互赋值只能在相同对象之间,或者赋给自动实例化对象的非自动实例化父对象。

     • 规则1:相互赋值的自动实例化对象变量必须具有相同类型

     • 规则2:若将自动实例化对象变量赋给其父对象变量,其父对象不能为自动实例化类型,父对象变量保存子对象变量引用的副本

     • 规则3:如将父对象变量赋给子对象变量,父对象变量必须持有子对象的实例句柄,否则会发生运行错误

    为例子的需要,我们假设对下面的对象已经做过定义。uo_emp_active 和 uo_emp_inactive 是非自动实例化对象 uo_empdata 的自动实例化子对象。

uo_empdata uo_emp1 // 父对象
uo_emp_active uo_empa, uo_empb // 子对象

    规则 1 的例子:上面说明的变量之间赋值,有些是不允许的。

uo_empb=uo_empa // 许可,相同类型
uo_empa=uo_emp1 // 不允许,类型不同

    规则 2 的例子:在赋值之后,uo_emp1 保存子对象 uo_empa 的一份拷贝,但 uo_emp1 不能为自动实例化对象,否则违反规则 1,会产生编译错误。

uo_emp1=uo_empa

    规则 3 的例子:在这个例子中,只允许 uo_emp1 中保存一个 uo_empa 的实例引用的情况。

uo_empa=uo_emp1

    如果 uo_emp1 中保存的不是 uo_empa 类型的对象引用,会发生运行错误。



 您阅读本篇文章共花了: 

免责声明
本站内容均为博客主本人日常使用记录的存档,如侵犯你的权益请联系:lifei@zaiheze.com 546262132@qq.com 沟通删除事宜。本站仅带访问端口形式使用,已杜绝搜索引擎爬取。

扫描二维码推送至手机访问。

版权声明:本文由LIFEI - blog发布,如需转载请注明出处。

本文链接:http://www.lifeiai.com/?id=40

分享给朋友:

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。