事实证明,只需很少的编码就可以做到。我可以使用语句 DELETE OBJECT THIS-OBJECT 来删除执行该语句的实例。所以如果它在一个静态方法中,它就是被删除的静态实例。
METHOD STATIC VOID Reload () :
DELETE OBJECT THIS-OBJECT.
END METHOD.
所以现在当我有一个新版本的类时,我只使用 MyClass:Reload()。无需结束我的会话。
感谢Tim Kuehn为我指出了正确的方向,他建议使用静态方法删除命名的小部件池。
我创建了这个例子来演示我是如何让它工作的。下面是一个带有 3 个静态方法的简单类:
/* File : rtt/cls/demo.cls */
USING Progress.Lang.*.
ROUTINE-LEVEL ON ERROR UNDO, THROW.
CLASS rtt.cls.demo USE-WIDGET-POOL :
METHOD STATIC CHARACTER SayHello() :
RETURN "Good-bye".
END METHOD.
METHOD STATIC VOID ShowMessage() :
MESSAGE "This is the message." VIEW-AS ALERT-BOX.
END METHOD.
METHOD STATIC VOID Reload() :
DELETE OBJECT this-object.
END METHOD.
END CLASS.
我不知道其他人的环境是如何设置的,但是在我的环境中我必须登录到我们的系统才能编译和运行程序,换句话说,我有一个活动会话。
所以我编译文件:
COMPILE VALUE(SEARCH("rtt/cls/demo.cls")) SAVE.
然后我在过程编辑器中运行以下位来测试它:
USING rtt.cls.*.
demo:ShowMessage().
MESSAGE demo:SayHello().
当我运行它时,我得到一个消息框,上面写着“这是消息。”,然后是一个消息框,上面写着“再见”。正如人们所期望的那样。
但是有一个错误,它应该说“你好”,而不是“再见”,所以我编辑了我的课程(我只展示了我正在改变的两种方法:
METHOD STATIC CHARACTER SayHello() :
RETURN "Hello".
END METHOD.
METHOD STATIC VOID ShowMessage() :
MESSAGE "That was the message." VIEW-AS ALERT-BOX.
END METHOD.
我保存更改,像以前一样编译它,然后再次运行测试。您希望看到什么消息?我希望看到“这就是信息”。和“再见”,和以前一样。这是合乎逻辑的,因为在我当前的会话中有一个隐藏的小部件池,并且它加载了我的类的一个实例(来自我的第一个测试)。它将继续使用此实例,直到实例或池被销毁。所以我关闭了我的开发环境,注销然后再次登录以启动一个新会话。到目前为止,一切都按预期工作。
现在我再次运行我的测试,果然,我得到了我的新版本:消息是“那是消息”和“你好”。
但是现在我被告知在“你好”这个词之后添加一个感叹号。所以我改变它:
METHOD STATIC CHARACTER SayHello() :
RETURN "Hello!".
END METHOD.
我保存并编译它。当我运行测试时,显然我会得到旧版本的“你好”而不带感叹号。在我的更改生效之前,我必须再次重新启动我的会话。我真的不想再这样做了。所以我改变我的测试如下:
USING rtt.cls.*.
demo:Reload().
demo:ShowMessage().
MESSAGE demo:SayHello().
我运行它,瞧,我得到了我的最新更改。我将消息从“那是消息”更改为“它有效!”。我保存、编译并运行我的测试。我看到了什么?我看到“它有效!”。不再在编辑之间重新启动我的会话。我的解决方案非常适合我。
我尝试了各种各样的东西,但我无法让它生成错误“无法从静态成员 (15071) 引用 THIS-OBJECT 或 SUPER”。