我从未使用过Smalltalk,但我已经阅读了很多关于它的内容,它一直引起我的兴趣。我已经看到了程序运行的很酷的演示,只需更改程序对象使用的类的方法就可以改变正在运行的程序的行为。它显然是强大的东西,我理解它是如何工作的。我似乎无法确定的是当你想要添加,删除或重命名该类的实例变量时,类的现有实例会发生什么。
我无法想象如何改变所有类在正在运行的程序中使用的实例变量,并且仍然期望该类的现有实例在之后正确运行。也许我正在添加一个我需要初始化的新实例变量,以及先前已存在的方法已被更改为依赖于此变量的位置。难道我最终没有任何运行代码的可怕故障,该代码具有该类的实时实例?或者如果实例变量的含义发生了变化,我现在期望在那里存储一种不同类型的对象,而不是之前的情况呢?有某种“升级”机制吗?或者通常的做法是让前面的实例崩溃并烧毁?或者这仅仅是“我们在运行程序时没有做那种事情并期望它们能够存活下来的情况”这样的情况。
我能想到的唯一合理干净的方法是,当您更改实例变量定义时,它实际上可能会创建一个全新的类,并且在更改之前,旧实例继续使用旧类定义正常运行(因为名称被重新定义为新的类定义,所以现在名称无法访问。也许这是最合乎逻辑的解释 - 但由于我没有找到任何直接解释这个过程的东西,我想我会问这里,看看有什么样的有趣信息让我感到兴奋。 :)
答案 0 :(得分:7)
根据this paper,就像你说的那样:
它还自动管理类重定义,保证系统在对象结构方面的一致性,防止名称冲突,尤其是实例变量名称冲突。当类定义发生更改时,必须对现有实例进行结构修改,以匹配其新类的定义。 ClassBuilder不是修改现有对象,而是创建一个具有正确结构的新结构(即,从替换旧结构的新类)。然后它用旧的对象填充这个新对象。 ClassBuilder使用become:primitive(cf 2.1.1)继续进行strutural修改,在整个系统中用旧的对象替换旧对象。