8

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

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

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

4

1 回答 1

8

根据这篇论文,就像你说的:

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

于 2009-11-13T06:13:11.293 回答