Database 版 (精华区)
发信人: lizhenguo (夸父·追日), 信区: Database
标 题: 3
发信站: 哈工大紫丁香 (2001年09月26日18:36:30 星期三), 站内信件
PowerBuilder面向对象的程序设计
在PowerBuilder的应用开发中,运用面向对象技术不是必须的,但是对于一个大型复杂应
用系统的开发,如果采用了面向对象技术,则开发效率会大大提高。
用PowerBuilder开发的好处是,即使您不懂得什么是面向对象技术,您也可能会下意识地
用到面向对象技术的一些特性,但是如果您对这一技术有了充分的了解,那对您所设计程
序的可重用性,可维护性和其他各方面的质量都会有大幅度提高。
PowerBuilder的对象
PowerBuilder对象有三个部分元素:属性、函数和事件。
(1)属性:也就是数据。包括系统属性和用户定义属性两类,描述该对象的各种特性。如在
窗口对象中的系统属性包括标题、高度、宽度等,用户定义的属性可以是实例变量或共享
变量,对这种属性的访问同系统属性相同,只是在封装性上有所不同。
(2)事件:PowerBuilder中的事件与Windows的事件存在着映射关系。当用户的操作或系统
本身产生了Windows的标准事件,就转化成PowerBuilder中的事件。例如命令按钮有一个
叫Clicked事件,当用户按按钮时触发,操作系统首先检测到鼠标被点击,并把Clicked这一
消息转给该按钮,PowerBuilder运行时的工作引擎翻译了这一事件,并执行适当的PowerS
cript语句。PowerBuilder中大部分的事件都是可以映射成由用户激发的Windows事件。
另一类事件是用户定义事件,这种事件是用户声明并可以在任何时刻由用户触发的,Powe
r-Builder中保留了75个用户事件可由程序员使用。
(3)函数:用户通过函数来使对象完成某些操作。Pow-erSoft公司建议用户通过调用对象
事件和函数来修改对象而不要直接修改对象属性,以满足对象封装的要求,例如采用Wind
ow.hide()而不要用Window.visi-ble=false来使窗口不可见。
PowerBuilder面向对象的特性
提到一门语言的面向对象特性,它应当具有继承性、多态性和封装性,如缺少其中的一个
则只能称其为基于对象的系统,而不是面向对象的系统,而PowerBuilder则很好地具备了
全部三个特性。
·继承:
PowerBuilder中,窗口、菜单和用户对象是可以继承的,而其他对象则都不能。当您继承
了一个对象,那您得到的子类将具有父类的属性、实例变量、共享变量、控件、用户自定
义事件、对象级函数、事件和代码(script)。也就是说当您继承了一个类,您几乎得到了
这个类的全部,不过有一点值得注意,您不能在子类中删除任何一个继承到的特性。
在继承了祖先类后,您可以在子类中扩展或覆盖祖先的元素。例如代码,在PowerBuilder
中缺省的是采用扩展方式,先执行继承到的祖先代码,后执行子类的扩展代码。您也可以
选择菜单Compiler|Override Ancestor Script选项,只执行子类的代码,并可在代码中的
任意位置调动祖先代码如CALL w_l∷open。
重载函数是面向对象程序设计的重要特性,即同一函数名却有着不同的参数和返回值。在
运行时,系统自动寻找执行参数相匹配的那个函数,例如我们常用的MessageBox()这个函
数就有12个不同参数的重载函数。遗憾的是,对Power-Builder我们不能在同一个继承对
象中定义2个不同参数的重载函数,只能在后继的类中定义重载函数,这使我们对重载函数
的定义带来了很大的不便,这不能不说是PowerBuilder的缺陷。(不过在即将发布的Powe
rBuilder5.0中,正是支持了函数重载这一特性。)
对于对象的继承,PowerBuilder中所有对象都有其共同的基类PowerObject,从这一个基类
下面分成继承Graph-icObject和NonVisualObject等。它们的继承关系和扩展函数及属性
如下表:
·多态性:
在PowerBuilder中有大量的多态函数如print()、TriggerEvent()等,在运行过程中,您只
需要指出对象和函数名即可。在有些函数中,即使不知道对象类,也可以用Class Name()
函数得到对象类,或得到实例名,将对象名作为函数参数调用该函数。
·封装性:
封装的目的是为了实现数据隐藏和数据保护,封装的目标是为对象提供一个对外操作的接
口,使其他对象通过函数来访问,而不允许直接操纵对象的属性。在PowerBuilder中有三
种访问类型Public、Protect、Private,这三种访问控制类型可以用在对象的变量和函数
上,缺省的实例变量和对象函数都是public类型的。为了保护数据,应尽可能多地使用pr
ivate和protect类型,前者只允许对象内部的元素来访问,后者可以接受对象内部和继承
类的元素访问。
PowerBuilder面向对象程序设计的过程
事实上用户在运用Power-Builder进行程序设计的一开始,就已经开始进行对象类的设计
:例如在建立窗口时可以用窗口画笔(painter)建立一个新窗口,命名为w_emp。建立的窗
口就是从PowerBuilder的窗口对象继承下来的,所以窗口会自动具备一些属性,例如X和Y
的坐标、高度、宽度、窗口类型、标题等。当用窗口画笔建立窗口时,您给这些属性赋了
值,你还可以增加窗口的函数和事件。当窗口被保存时,你就建立了一个新的窗口继承类
,称为:w_emp。输出对象的句法显示的部分程序如下:
global type w_emp from Window
int X=200
int Y=233
int Width=2405
int Height=1285
boolean TitleBar=true
string Title="Employee Mainte-nance"
string MenuName="m_emp"
long BackColor=12632256
boolean ControlMenu=true
boolean MinBox=true
boolean MaxBox=true
boolean Resizable=true
.
.
.
end type
global w_emp w_emp
请注意系统在这里做了什么:首先定义了w_emp窗口类是从window类继承而来,接着定义这
一对象类的各属性值,在句法的最后一行声明了一个全局变量,变量的类型(对象类)是w_
emp,变量名(对象实例)也是w_emp。也就是说在您建立了w_emp这一窗口对象后,系统就具
有了w_emp这一对象类和w_emp这一全局变量。这个变量是引用变量,也就是在有些语言称
之为指针的变量类型。引用变量并不真正含有窗口实例的属性,而是包含了一个位置或是
内存中的一个地址,在那儿你可以找到实例的实际属性和程序。但在应用的开始时这一指
针为空,因为在内存中并没有一个这样的窗口实例。当系统执行了Open(w_emp)后,系统在
内存中复制了一份w_emp对象类的拷贝或实例,w_emp这一参照变量指向了这一地址。由于
窗口对象的visible等属性都是Public型,所以继承类也都具有了这些属性。
--
《列子·汤问》:“夸父不量力,欲追日影,逐之于隅谷之际。渴欲 得饮,赴饮河渭
。河渭不足,将走北饮大泽。未至,道渴而死。”
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.229.154]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.886毫秒