请教,基类的修改对子类的影响

zhangyangziwo 2014-03-06 10:21:42
4号时,我修改了窗口基类w_basewindow上的缩放函数,open事件,删除了一个实例变量,
然后打包了两个dll文件,这两个dll文件内包含的窗口都打不开了,程序直接死掉,其他dll内的窗口没问题。
然后,我把包含窗口基类的dll也打包,先前打包的两个dll内的窗口显示正常了,但是其他的窗口有显示不正常啦。
最后,我将基类恢复原样,然后将修改的两个dll重新打包,算问题过去啦。

所以产生了一个问题,基类的那些修改,会对子类有影响,需要子类重建,或者重新打包DLL文件。
我的理解,
1、修改基类的默认的事件应该是不影响子类的。
2、增加基类的实例变量,子类需要重建?
3、删除基类的实例变量,子类需要重建?我知道子类代码内不会自动删除,需要手动删除。
4、增加基类的函数,子类应该不用重建吧

暂时想到的,我找资料看看吧,先把问题发上来,如果有现成的解答,或者提供资料,不胜感激。
...全文
631 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangyangziwo 2014-04-16
  • 打赏
  • 举报
回复
上边为两位大师啊, 学习啦 今天结贴,结贴之后,一般都没人关注啦 哎
kenshu 2014-04-06
  • 打赏
  • 举报
回复
引用 11 楼 PackChen 的回复:
父类增加变量要看类型的 不是说子类就一定要在变量定义下标中被动增加1 kenshu你只考虑到一层继承而已,多层继承中你想过没有? 要区分private,protected,privatewrite等 同时,如果只是单纯的增加一个public变量,任何子类都没有使用这个变量(打开子类源文件,没有这个变量),那么也不需要fullbuild的 最后,你们大多都使用pb自己的编译器吧,我不是,我用的是powergen,powergen处理这个聪明多了,并且powergen可以用高版本的编译器直接编译低版本的pb代码,而不用去升级
1."kenshu你只考虑到一层继承而已,多层继承中你想过没有?" 我想过, 比如 super0->super1->child child 加一个 string is_child1//没问题 super1 再加一个 string is_super1//也没问题 super0 再加一个 string is_super0//还是没问题 一些时候,你直接运行,都没问题。 但是,不FULL-REBUILD的情况下,很特别的情况下,会出现 bad runtime 的错误。//具体是哪一些极端的情况会有问题,我之前其实见过,但因为没有保留文档,所以一时间确实举不出例子 比如有个程序,(假定有一个很复杂的操作),比如双击100次,单击一次,再双击两次,可能会有问题,当然也可能没问题。(如果我们知道这件事)我们的操作指引中,会明确告诉用户,"不要连续双击100次"。 同样的道理,(如果我们知道,一些情况下,不FULL-REBUILD可能会有问题,留意,仅仅是可能,并且虽然我们并不完全清楚在哪里。),那我们开出来的指引就是,"永远是FULL-REBUILD" 而且我还相信,SYBASE可能也不清楚这些问题。 比如MACHINE-CODE编译的问题。我找到过一些代码,MACHINE-CODE方式编译时,是会有问题的。相信我找到的这些代码,SYBASE也不一定清楚,要不然这个巨大的BUG,也一早改了。轮不到我这种死跑龙套的来发现。 2."要区分private,protected,privatewrite等" 类似这些accept的修饰词,原则上,是程序员自己给自己下的紧箍咒,告诉编译器,"这里是不能修改的,如果万一我不小心在哪里修改了,请抽我一巴掌,告诉我,别改了" 那么,这时,这个修饰词,仅在编译时是需要的。和运行时基本上是没有关系的。 当然,编译器也可以使它有关系,比如在运行时直接弹出去这个错误。 但PB这里没有,它只是在编译时控制,运行时不控制。 也就是,编译后的东西,private/public基本上是一致的。(会略有不同,但这个不是关键) 说到这里,顺便提一下,constant这个关键字,和其它关键字是不同的。PB编译时,会直接把这个关键字修饰下的"变量",直接替换为"常量" 3."同时,如果只是单纯的增加一个public变量,任何子类都没有使用这个变量(打开子类源文件,没有这个变量),那么也不需要fullbuild的" 具体的原因同第一点,为了方便理解,其中的一个例子可能是 public: string super_1//这个没子类用到,这里就是为了举例说明,"单纯的增加一个public变量,任何子类都没有使用这个变量" string super_2//这个有子类用到了,但这个道理上应该"+2" 4."powergen"这个没用过,但听您这么一说,也很想搞个来试试,方便给个链接吗?谢谢!
PackChen 2014-04-05
  • 打赏
  • 举报
回复
父类增加变量要看类型的 不是说子类就一定要在变量定义下标中被动增加1 kenshu你只考虑到一层继承而已,多层继承中你想过没有? 要区分private,protected,privatewrite等 同时,如果只是单纯的增加一个public变量,任何子类都没有使用这个变量(打开子类源文件,没有这个变量),那么也不需要fullbuild的 最后,你们大多都使用pb自己的编译器吧,我不是,我用的是powergen,powergen处理这个聪明多了,并且powergen可以用高版本的编译器直接编译低版本的pb代码,而不用去升级
发现 2014-03-07
  • 打赏
  • 举报
回复
看来这里PB大神很多啊
kenshu 2014-03-07
  • 打赏
  • 举报
回复
引用 6 楼 lzp_lrp 的回复:
...... 2、增加基类的实例变量,子类需要重建? 答:这个对子类没有影响 3、删除基类的实例变量,子类需要重建?我知道子类代码内不会自动删除,需要手动删除。 答:这个肯定有影响,子类需要重建 ......
版主说的是常见情况,但实际一些不常见的不在此例。 就事论事,如果减少实例变量有影响,那增加也会有影响。 因为上面说的100和101的情况。//不要问我为什么知道,我叫雷锋。这个问题,在精力/能力/时间/兴趣都是最充沛的时候,花了兄弟我超过半年的时间。说出来都是泪。 --------------------------- 换成我们自己来写编译器, 假定写一个父类,它实例化的时候,占8个CHAR的内存。操作系统(实际到PB,你可以认为是虚拟机)会为它HOLD住8个字节的内存。 //留意,同一个类的多个实例,比如"my_userobject_class luo_temp[100]",共享变量和函数/事件执行体只使用一个副本(我们指的是一般按普遍编译原理开发的编译器,你硬要开100个副本不在此例)。8个CHAR我们只算实例变量。 那子类新的实例变量,会从第9个字节开始。 --------------------------- 父类加一个实例变量的时候,它也是从第9位开始的。并且原理上,它不会通知所有的子类(假如你不FULL-REBUILD的话),"你之前以为我长了两只手,现在老子长三只了"。//因为它不知道谁引用了它作为祖先。曾孙知道谁是它的曾祖父,但曾祖父不知道他有几个曾孙。 当然,这些问题,技术上是有办法解决的。PB也解决了其中的大部份。(这个就不举例子了,因为多少算商业秘密。但我敢保证,SYBASE一定/*或至少在某些PB的版本上*/没有解决一些问题) 但很不幸,其中的一小部分并没有解决。//不要问我为什么知道,我叫雷锋。我家里有三部电脑,24小时满CPU运行跑了几年,大部分的工作,是为了找到这些问题,让我可以解决或至少是知道它们哪里。 --------------------------- 写这么多,其实只是说,反正100和101这个问题是存在的。 具体例子在 http://www.shuct.net/shudl.asp?id=20091227 测试一下运行结果,或用反编译器(我不说用哪个编译器可以看出结果/*有一些看不出的*/,自己找。),分析其中的两个EXE,因为父类变了,会导致子类运行结果不同。 //不一定需要看清楚原因或原理,只是为了向您说明,100/101的问题是存在的。 类似的现象其实还有,并且不少。 --------------------------- 写这么多,是为了说明。 重要, 我们的建议是,发布程序前,FULL-REBUILD,并一起发布。不然可能有问题,甚至其中的一些问题,SYBASE(或现在是SAP),都不一定知道。
zhangyangziwo 2014-03-07
  • 打赏
  • 举报
回复
引用 8 楼 jlx369zxc 的回复:
看来这里PB大神很多啊
是啊 终于有些兴奋的感觉啦 我们的坛子有些沉寂过久啦
zhangyangziwo 2014-03-07
  • 打赏
  • 举报
回复
搜到一贴,觉得有用,也复制过来了,跟本贴题目不一定紧密相关 第三讲:PowerBuilder面向对象的程序设计 张健姿 01-6-21 下午 03:12:35 -------------------------------------------------------------------------------- 在PowerBuilder的应用开发中,运用面向对象技术不是必须的,但是对于一个大型复杂应用系统的开发,如果采用了面向对象技术,则开发效率会大大提高。 用PowerBuilder开发的好处是,即使您不懂得什么是面向对象技术,您也可能会下意识地用到面向对象技术的一些特性,但是如果您对这一技术有了充分的了解,那对您所设计程序的可重用性,可维护性和其他各方面的质量都会有大幅度提高。 PowerBuilder的对象 PowerBuilder对象有三个部分元素:属性、函数和事件。 (1)属性:也就是数据。包括系统属性和用户定义属性两类,描述该对象的各种特性。如在窗口对象中的系统属性包括标题、高度、宽度等,用户定义的属性可以是实例变量或共享变量,对这种属性的访问同系统属性相同,只是在封装性上有所不同。 (2)事件:PowerBuilder中的事件与Windows的事件存在着映射关系。当用户的操作或系统本身产生了Windows的标准事件,就转化成PowerBuilder中的事件。例如命令按钮有一个叫Clicked事件,当用户按按钮时触发,操作系统首先检测到鼠标被点击,并把Clicked这一消息转给该按钮,PowerBuilder运行时的工作引擎翻译了这一事件,并执行适当的PowerScript语句。PowerBuilder中大部分的事件都是可以映射成由用户激发的Windows事件。另一类事件是用户定义事件,这种事件是用户声明并可以在任何时刻由用户触发的,Power-Builder中保留了75个用户事件可由程序员使用。 (3)函数:用户通过函数来使对象完成某些操作。Pow-erSoft公司建议用户通过调用对象事件和函数来修改对象而不要直接修改对象属性,以满足对象封装的要求,例如采用Window.hide()而不要用Window.visi-ble=false来使窗口不可见。 PowerBuilder面向对象的特性 提到一门语言的面向对象特性,它应当具有继承性、多态性和封装性,如缺少其中的一个则只能称其为基于对象的系统,而不是面向对象的系统,而PowerBuilder则很好地具备了全部三个特性。 ·继承: PowerBuilder中,窗口、菜单和用户对象是可以继承的,而其他对象则都不能。当您继承了一个对象,那您得到的子类将具有父类的属性、实例变量、共享变量、控件、用户自定义事件、对象级函数、事件和代码(script)。也就是说当您继承了一个类,您几乎得到了这个类的全部,不过有一点值得注意,您不能在子类中删除任何一个继承到的特性。 在继承了祖先类后,您可以在子类中扩展或覆盖祖先的元素。例如代码,在PowerBuilder中缺省的是采用扩展方式,先执行继承到的祖先代码,后执行子类的扩展代码。您也可以选择菜单Compiler|Override Ancestor Script选项,只执行子类的代码,并可在代码中的任意位置调动祖先代码如CALL w_l∷open。 重载函数是面向对象程序设计的重要特性,即同一函数名却有着不同的参数和返回值。在运行时,系统自动寻找执行参数相匹配的那个函数,例如我们常用的MessageBox()这个函数就有12个不同参数的重载函数。遗憾的是,对Power-Builder我们不能在同一个继承对象中定义2个不同参数的重载函数,只能在后继的类中定义重载函数,这使我们对重载函数的定义带来了很大的不便,这不能不说是PowerBuilder的缺陷。(不过在即将发布的PowerBuilder5.0中,正是支持了函数重载这一特性。) 对于对象的继承,PowerBuilder中所有对象都有其共同的基类PowerObject,从这一个基类下面分成继承Graph-icObject和NonVisualObject等。它们的继承关系和扩展函数及属性如下表: ·多态性: 在PowerBuilder中有大量的多态函数如print()、TriggerEvent()等,在运行过程中,您只需要指出对象和函数名即可。在有些函数中,即使不知道对象类,也可以用Class Name()函数得到对象类,或得到实例名,将对象名作为函数参数调用该函数。 ·封装性: 封装的目的是为了实现数据隐藏和数据保护,封装的目标是为对象提供一个对外操作的接口,使其他对象通过函数来访问,而不允许直接操纵对象的属性。在PowerBuilder中有三种访问类型Public、Protect、Private,这三种访问控制类型可以用在对象的变量和函数上,缺省的实例变量和对象函数都是public类型的。为了保护数据,应尽可能多地使用private和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型,所以继承类也都具有了这些属性
A啦Dbit 2014-03-06
  • 打赏
  • 举报
回复
引用 3 楼 kenshu 的回复:
你改了基类,整个工程需要FULL-REBUILD(当然一些时候是不需要,甚至大部份情况下不需要。但作为一种好习惯,我们的建议是,不论何时,永远都是FULL-REBUILD) .....
+1
kenshu 2014-03-06
  • 打赏
  • 举报
回复
引用 楼主 zhangyangziwo 的回复:
4号时,我修改了窗口基类w_basewindow上的缩放函数,open事件,删除了一个实例变量, 然后打包了两个dll文件,这两个dll文件内包含的窗口都打不开了,程序直接死掉,其他dll内的窗口没问题。 然后,我把包含窗口基类的dll也打包,先前打包的两个dll内的窗口显示正常了,但是其他的窗口有显示不正常啦。 最后,我将基类恢复原样,然后将修改的两个dll重新打包,算问题过去啦。 所以产生了一个问题,基类的那些修改,会对子类有影响,需要子类重建,或者重新打包DLL文件。 我的理解, 1、修改基类的默认的事件应该是不影响子类的。 2、增加基类的实例变量,子类需要重建? 3、删除基类的实例变量,子类需要重建?我知道子类代码内不会自动删除,需要手动删除。 4、增加基类的函数,子类应该不用重建吧 暂时想到的,我找资料看看吧,先把问题发上来,如果有现成的解答,或者提供资料,不胜感激。
你改了基类,整个工程需要FULL-REBUILD(当然一些时候是不需要,甚至大部份情况下不需要。但作为一种好习惯,我们的建议是,不论何时,永远都是FULL-REBUILD) 其中的情况比如(这只是一个简单的例子,实际不同的情况很多很多) ------------------------------------ 1.子类(在很久以前)就加了一个实例变量 比如 long il_child 2.父类在这之后,也加了一个实例变量 比如 string is_base (你打开子类,会看到一个is_base的属性) //同一个东西,父类就有的,它就显示为属性(Propertie),到自己这一层才有的,它就显示为实例变量(Instance Variable) 这两个东西,就PB内部而言,完全是相同的东西 ------------------------------------ 按我们一般所能看到的公开的文档,父类加了这个实例变量没有影响到子类。 但实际上是有。 (一些时候,只是一些时候,不是全部时候) PB并不是用实例变量名指代这个变量,而是用序号 比如 "第100个实例变量" 那好了,最开始,父类有99个实例变量或属性 子类加的"long il_child"是第100个 父类后来加"string is_base",它也是第100个 到这里,运行时会有问题。 如果你FULL-REBUILD,PB才会帮你把"long il_child"改为第101个.
zhangyangziwo 2014-03-06
  • 打赏
  • 举报
回复
引用 1 楼 zlf19810306 的回复:
1、修改基类的默认的事件应该是不影响子类的。 这个在子类的事件里右键,看Extend Ancestor Script是否勾上,勾上了会有影响,没勾上就没影2、增加基类的实例变量,子类需要重建? 这个如果只是基类使用了应该不用重建
1、应该是不用重建,也不用重新打包dll文件吧
zlf19810306 2014-03-06
  • 打赏
  • 举报
回复
1、修改基类的默认的事件应该是不影响子类的。 这个在子类的事件里右键,看Extend Ancestor Script是否勾上,勾上了会有影响,没勾上就没影2、增加基类的实例变量,子类需要重建? 这个如果只是基类使用了应该不用重建
WorldMobile 2014-03-06
  • 打赏
  • 举报
回复
引用 楼主 zhangyangziwo 的回复:
4号时,我修改了窗口基类w_basewindow上的缩放函数,open事件,删除了一个实例变量, 然后打包了两个dll文件,这两个dll文件内包含的窗口都打不开了,程序直接死掉,其他dll内的窗口没问题。 然后,我把包含窗口基类的dll也打包,先前打包的两个dll内的窗口显示正常了,但是其他的窗口有显示不正常啦。 最后,我将基类恢复原样,然后将修改的两个dll重新打包,算问题过去啦。 所以产生了一个问题,基类的那些修改,会对子类有影响,需要子类重建,或者重新打包DLL文件。 我的理解, 1、修改基类的默认的事件应该是不影响子类的。 2、增加基类的实例变量,子类需要重建? 3、删除基类的实例变量,子类需要重建?我知道子类代码内不会自动删除,需要手动删除。 4、增加基类的函数,子类应该不用重建吧 暂时想到的,我找资料看看吧,先把问题发上来,如果有现成的解答,或者提供资料,不胜感激。
建议这么处理,供参考 修改基类,full rebuild,至于发布哪些dll,根据修改基类内容。 1、修改基类的默认的事件应该是不影响子类的。 答:这个会有影响,尤其是基类本来没有代码,增加了代码,肯定会影响子类的。 2、增加基类的实例变量,子类需要重建? 答:这个对子类没有影响 3、删除基类的实例变量,子类需要重建?我知道子类代码内不会自动删除,需要手动删除。 答:这个肯定有影响,子类需要重建 4、增加基类的函数,子类应该不用重建吧 答:这个对子类没有影响 对子类没有影响的,你可以只发布基类,对子类有影响的,你要发布所有。
zhangyangziwo 2014-03-06
  • 打赏
  • 举报
回复
引用 3 楼 kenshu 的回复:
[quote=引用 楼主 zhangyangziwo 的回复:] 4号时,我修改了窗口基类w_basewindow上的缩放函数,open事件,删除了一个实例变量, 然后打包了两个dll文件,这两个dll文件内包含的窗口都打不开了,程序直接死掉,其他dll内的窗口没问题。 然后,我把包含窗口基类的dll也打包,先前打包的两个dll内的窗口显示正常了,但是其他的窗口有显示不正常啦。 最后,我将基类恢复原样,然后将修改的两个dll重新打包,算问题过去啦。 所以产生了一个问题,基类的那些修改,会对子类有影响,需要子类重建,或者重新打包DLL文件。 我的理解, 1、修改基类的默认的事件应该是不影响子类的。 2、增加基类的实例变量,子类需要重建? 3、删除基类的实例变量,子类需要重建?我知道子类代码内不会自动删除,需要手动删除。 4、增加基类的函数,子类应该不用重建吧 暂时想到的,我找资料看看吧,先把问题发上来,如果有现成的解答,或者提供资料,不胜感激。
你改了基类,整个工程需要FULL-REBUILD(当然一些时候是不需要,甚至大部份情况下不需要。但作为一种好习惯,我们的建议是,不论何时,永远都是FULL-REBUILD) 其中的情况比如(这只是一个简单的例子,实际不同的情况很多很多) ------------------------------------ 1.子类(在很久以前)就加了一个实例变量 比如 long il_child 2.父类在这之后,也加了一个实例变量 比如 string is_base (你打开子类,会看到一个is_base的属性) //同一个东西,父类就有的,它就显示为属性(Propertie),到自己这一层才有的,它就显示为实例变量(Instance Variable) 这两个东西,就PB内部而言,完全是相同的东西 ------------------------------------ 按我们一般所能看到的公开的文档,父类加了这个实例变量没有影响到子类。 但实际上是有。 (一些时候,只是一些时候,不是全部时候) PB并不是用实例变量名指代这个变量,而是用序号 比如 "第100个实例变量" 那好了,最开始,父类有99个实例变量或属性 子类加的"long il_child"是第100个 父类后来加"string is_base",它也是第100个 到这里,运行时会有问题。 如果你FULL-REBUILD,PB才会帮你把"long il_child"改为第101个.[/quote] 感谢kenshu的热情回复。 全部重新编译肯定是保证没有问题啦, 但是工作中,我们还是要少打包几个dll文件,好给客户打补丁嘛,文件非常多,估计客户跟技术支持的都烦啦 得到的教训就是基类少改,做好测试,O(∩_∩)O~

740

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 脚本语言
社区管理员
  • 脚本语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧