【问题标题】:Redefining instance variables of a Smalltalk class重新定义 Smalltalk 类的实例变量
【发布时间】:2009-11-13 06:07:00
【问题描述】:

我从未使用过 Smalltalk,但我读过很多关于它的文章,而且它一直让我很感兴趣。我已经看到了程序正在运行的很酷的演示,并且只需更改程序对象正在使用的类的方法就可以改变正在运行的程序的行为。它显然是强大的东西,我理解它是如何工作的。我似乎无法确定的是,当您想要添加、删除或重命名该类的实例变量时,该类的现有实例会发生什么。

我无法想象如何更改所有类在正在运行的程序中使用的实例变量,并且仍然期望该类的现有实例在之后正常运行。也许我正在添加一个需要初始化的新实例变量,并且以前存在的方法已更改为依赖于该变量。难道我不能以具有该类的实时实例的任何正在运行的代码出现可怕的故障而告终吗?或者,如果实例变量的含义发生了变化,我现在希望在其中存储与以前不同类型的对象怎么办?是否有某种“升级”机制?还是让之前的实例崩溃和烧毁的通常做法是什么?或者这仅仅是“我们不会在运行程序时做那种事情并期望它们能够生存”的情况?

我能想到的唯一合理干净的方法是,当您更改实例变量定义时,它可能实际上创建了一个全新的类,而旧实例在更改之前继续使用旧类定义正常运行(现在无法通过名称访问,因为名称已重新定义为新的类定义)。也许这是最合乎逻辑的解释——但由于我还没有找到任何可以直接解释这个过程的东西,我想我会在这里问一下,看看什么样的有趣信息让我受益匪浅。 :)

【问题讨论】:

    标签: smalltalk


    【解决方案1】:

    根据this paper,就像你说的:

    它还自动管理类重定义,保证系统在对象结构方面的一致性并防止名称冲突,尤其是实例变量名称冲突。当类定义更改时,必须对现有实例进行结构修改以匹配其新类的定义。 ClassBuilder 不是修改现有对象,而是创建一个具有正确结构的新对象(即,从替换旧类的新类)。然后它用旧对象的值填充这个新对象。 ClassBuilder 使用 become: 原语(参见 2.1.1)通过在整个系统中用新对象替换旧对象来进行结构修改。

    【讨论】:

    • 太棒了!谢谢你的链接。我不知道为什么我的 Googlefu 不够强大,无法找到这个答案。在发布这个问题之前我尝试了很长时间!我一定错过了一个重要的关键字。 :P
    猜你喜欢
    • 1970-01-01
    • 2021-01-14
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多