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

Smalltalk 当我加载包含该类的Monticello包时,是否有一个特定的方法会在类中执行?,smalltalk,pharo,squeak,monticello,Smalltalk,Pharo,Squeak,Monticello,当我加载包含该类的Monticello包时,是否有一个特定的方法会在类中执行 例如: 第1版 SomeMonticelloPackage-MyName.1.mcz: Object subclass: #SomeClass classVariableNames: 'ImportantParameter' SomeClass class>>defaultParameter ^ false SomeClass class>>initialize Im

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

例如:

第1版

SomeMonticelloPackage-MyName.1.mcz:

Object subclass: #SomeClass
    classVariableNames: 'ImportantParameter'

SomeClass class>>defaultParameter
    ^ false

SomeClass class>>initialize
    ImportantParameter := self defaultParameter
在版本2中,我更改了ImportantParameter的默认值

SomeMonticelloPackage-MyName.2.mcz:

SomeClass class>>defaultParameter
    ^ true

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

因此,我希望存在一些方法,当包含该类的Monticello包加载到映像中时,该方法将在类中调用,以便我可以重新初始化该类。有吗?这个问题还有其他解决方案吗?

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

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

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


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

我真的不明白您的问题。为什么我首先要加载任意版本?只需使用正确的默认值创建一个新版本,在签出最新版本时一切都会正常。有人可能会在有新版本可用时立即更新她的版本。“但要小心:如果另一个包版本具有相同的initialize class方法,它将不会再次执行。”确定,这正是我一开始所经历的!我选择了一个更简单的例子来说明我的问题,而这个例子显然选得不好,所以我更新了我的例子以正确地反映我的问题。(意味着您也可以更新答案,因为现在将不再执行initialize?“因此,如果您想要强制执行initialize方法,您至少需要给它一个不同的时间戳。”因此,这似乎是解决方案。但这也有点奇怪;)谢谢你全面的解释!在您更改的示例中,我猜您想说“self-defaultParameter”。