PowerBuilder 对象与结构 上
一、对象的概念
在面向对象编程中,对象是指包括数据和与之联系的方法的封装模块。PowerBuilder 的大多数实体都是对象,包括窗口和控件之类的可视对象,事务对象和错误处理对象那样的非可视对象,以及那些自定义的可视对象和非可视对象。
一个对象的类是指一个对象的定义。可以在窗口画板、菜单画板、应用程序画板和用户对象画板中生成对象定义。用户可以在窗口中添加控件,给对象赋初值,说明 Instance 型变量和函数,并为事件和函数编写脚本。
一个对象实例是指在应用程序运行期间对象的一次引用。用户的代码使一个对象实例化,为该对象分配内存,按照类定义实例。
对象的引用是对对象实例的处理。我们需要引用对象与对象进行交互作用,除此之外没有其他办法访问对象。可以把对象引用赋给一个适当类型的变量。
PowerBuilder 中包括两种对象:一种是系统对象,它们由 PowerBuilder 定义,从基类 PowerObject 继承而来,而且它们是所有自定义对象的祖先,可以使用对象浏览器察看系统对象继承关系;二是在画板中自定义的对象,这些对象可以在 Window,Menu 等不同画板中定义,它们都是从系统对象或另一个自定义对象继承而来的。
二、用户对象
用户对象主要有两种:可视(visual)用户对象和类(class)用户对象。
可视用户对象有以下三种:
(1)标准型(Standard):从特定可视控件继承而来,可以设置属性和编写脚本,这些对象具有与父控件相同的事件和属性,还具有新加入的事件和属性。
(2)定制型(Custom):继承自 UserObject 系统类,可以包含多种控件和为其事件编写的脚本。
(3)外部型(External):在 DLL 中定义的可视控件,不属于 PowerBuilder 的继承关系树,DLL 的开发者提供信息,以便设置控件对象界面所需的风格,外部型对象的事件、函数和属性由 DLL 的开发者设计,这和可以嵌入 OLE 控件的 OCX 不同。
类用户对象由属性、函数和事件组成,但不包含可视组件。它有以下两种对象:
(1)标准型(Standard):继承于一些非可视控件,例如:事务对象、错误处理对象等。用户可以加入实例变量。有少量非可视对象含有事件,用户必须定义用户对象,以便为这些事件编写脚本。
(2)定制型(Custom):一个用来定义实例变量、事件函数和成员函数的自创对象,可以使用该对象封装一组具有特定功能的设计。
三、对象实例化
根据对象的类和实例的命名方式,可以简单地认为类和实例是同一件事物。例如:在窗口画板中定义了一个窗口的同时,也就定义了一个类。
在只使用 OPEN 这种简单的方式打开一个窗口时,也就实例化了一个对象,类和实例使用相同的名字。
在应用中 w_main 是 w_main 类型的一个全局变量(Global),例如:
OPEN(w_main)
若使用上述方式打开窗口,则只能打开该对象的一个实例。若要使用多个实例,则需要定义保存对象引用的变量,例如:
w_main w_1,w_2;OPEN(w_1) ;OPEN(w_2) ;
也可以在打开窗口时指定对象的类,例如:
w_main w_1,w_2 ;OPEN(w_1,"w_main") ;OPEN(w_2,"w_main") ;
对于类用户对象,用户常常定义变量保存对实例的引用,用 CREATE 语句实例化对象。在下面的例子中引用了一个对象的两个实例:
uo_emp_data uo_1,uo_2;uo_1=CREATE uo_emp_data ;uo_2=CREATE uo_emp_data ;
三、父对象和子对象
PowerBuilder 中一个对象可以继承自另一个对象。继承对象(或称子对象)具有父对象的全部实例变量、事件和成员函数。可以通过增加更多的变量、事件和函数扩充子对象。如果用户修改了父对象,即便在编辑过子对象之后,子对象也能兼容这些改变。
四、管理内存
对象实例占用内存。当对象实例使用完毕后,需要通过清除对象来释放内存。使用正确的 CLOSE 语句
关闭窗口或可视用户对象,可以清除该对象并释放其占用的内存,例如:
CLOSE(w_1) ;CLOSE(w_2) ;
对于类用户对象,可以使用 DESTROY 语句,例如:
DESTROY uo_1 ;DESTROY uo_2 ;
在如下情况会发生内存泄漏:当一持有对象引用的变量在清除其持有对象之前被释放时,则其持有对象所占内存只有在引用程序结束时才能被释放。例如,当一局部变量(local)持有一对象,在没有清除该对象的情况下,该脚本运行结束了,系统自动释放了这个局部变量,然而其持有的对象却仍然占用着它的内存。遗憾的是我们已不能访问它了,只有等到应用程序结束时才能释放这部分内存。