我很好奇当类侧初始化消息是在Smalltalk(特别是Pharo和Squeak)中发送的。有没有指定的订单?是否至少可以安全地假设与其一起打包的所有其他类已经被加载和编译,或者系统是否急切地初始化(在完成加载和编译其他类之前发送初始化)?
答案 0 :(得分:4)
系统永远不会发送班级initialize
。在开发期间,您可以手动执行此操作(这就是为什么其中许多方法都有"self initialize"
注释。
将类的代码导出到变更集时,导出器会在最后发送initialize
的发送,因此当类加载到另一个系统时会执行它。
Monticello模仿了这种行为。首次加载类时,或者initialize
方法的代码更改时,将执行该类。这是因为概念上MC在运行中构建了一个变更集,其中包含已经存在的图像和要加载的包所包含的内容的差异。如果该diff包含类侧initialize
方法,则在加载该包版本时将执行该方法。
答案 1 :(得分:3)
当您询问加载和编译时,我假设您在加载代码时的意思......
加载包或变更集时,在安装所有代码(1)后调用类侧#initialize方法。虽然您不能指望特定订单,但您可以假设已加载该包中的所有类和方法。
正如Bert所指出的,如果您没有加载实施类侧#initialize,那么您必须自己发送消息。
答案 2 :(得分:1)
确定的一种方法是自己测试。 Smalltalk系统使这种事情比许多其他系统更容易接近。只需定义一个您自己的MyTestClass
,然后实现您自己的类端(这是重要的)initialize
消息,这样您就可以在发生火灾时自行发现它发生的频率等等。
initialize
Transcript show: 'i have been INITIALIZED!!! Muwahahahah!!!'
通过打开Transcript
并运行
MyTestClass initialize
来自Workspace
。现在你可以把它归档并重新载入,蒙蒂塞洛装载,无论何时以及何时运行。