当我加载包含此类的Monticello包时,是否有一个特定的方法可以在类中执行?

时间:2013-02-12 19:53:06

标签: smalltalk pharo squeak monticello

当我加载包含此类的Monticello包时,是否存在可在类中执行的特定方法?

一个例子:

版本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将使用错误的默认值。

所以我希望当一个包含这个类的Monticello包被加载到一个图像中时,会在类中调用一些方法,所以我可以重新初始化该类。有吗?还有另一个解决这个问题的方法吗?

1 个答案:

答案 0 :(得分:3)

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

更准确地说,如果initialize方法与图像中已有的方法不同,则会执行该方法。 MC特别对待这些类初始值设定项(就像使用更改集而非Monticello时对它们进行特殊处理一样)。

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

但请注意:如果另一个软件包版本具有完全相同的initialize类方法,则不会再次执行。这是因为蒙蒂塞洛在加载包时只考虑与图像中的方法不同的方法,以及加载版本提供的方法。因此,如果您希望强制执行initialize方法,则至少需要为其提供不同的时间戳。