4

当我加载包含此类的蒙蒂塞洛包时,是否有特定方法会在类中执行?

一个例子:

版本 1,

SomeMonticelloPackage-MyName.1.mcz:

Object subclass: #SomeClass
    classVariableNames: 'ImportantParameter'

SomeClass class>>defaultParameter
    ^ false

SomeClass class>>initialize
    ImportantParameter := self defaultParameter

在版本 2 中,我更改了重要参数的默认值,

SomeMonticelloPackage-MyName.2.mcz:

SomeClass class>>defaultParameter
    ^ true

SomeClass class>>initialize
    ImportantParameter := self defaultParameter
  • 如果我将第 1 版加载到空图像中,一切正常。
  • 如果我将第 2 版加载到空图像中,一切正常。
  • 如果我先加载第 1 版,然后再加载第 2 版,那么第 2 版会使用错误的默认值。

所以我希望当一个包含这个类的蒙蒂塞洛包被加载到一个图像中时,可以在一个类中调用一些方法,这样我就可以重新初始化这个类。有吗?这个问题还有其他解决方案吗?

4

1 回答 1

3

是的,当您加载 MC 包时,会执行一个特定的方法:initialize方法!

更准确地说,如果initialize方法与图像中已经存在的方法不同,它就会被执行。MC 对这些类初始化器进行特殊处理(就像在使用变更集而不是 Monticello 时对它们进行特殊处理一样)。

所以在你的例子中,一切都很好。加载第二个版本initialize将导致它被执行。(编辑:既然你更新了你的例子,所以初始化本身没有被修改,你需要遵循我下一段中的建议)。

但要小心:如果另一个包版本具有相同的确切initialize类方法,它将不会再次执行。这是因为蒙蒂塞洛在加载包时,只考虑与图像中不同的方法,以及加载版本提供的方法。所以如果你想强制执行该initialize方法,你至少需要给它一个不同的时间戳。

于 2013-02-13T12:10:49.103 回答