【问题标题】:Is there a specific method that would get executed in a class when i load a Monticello package containing this class?当我加载包含此类的蒙蒂塞洛包时,是否有特定的方法会在类中执行?
【发布时间】:2013-02-12 19:53:05
【问题描述】:

当我加载包含此类的 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 版会使用错误的默认值。

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

【问题讨论】:

  • 我真的不明白你的问题。为什么我首先要加载任意版本?只需创建一个具有正确默认值的新版本,在签出最新版本时一切都会好起来的。
  • 一旦有新版本可用,有人可能会更新她的版本。

标签: smalltalk pharo squeak monticello


【解决方案1】:

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

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

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

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

【讨论】:

  • "但请注意:如果另一个包版本具有完全相同的初始化类方法,则不会再次执行。"好的,这正是我最初所经历的!我选择了一个更简单的例子来说明我的问题——这个例子显然选错了..
  • 所以我更新了我的示例以正确反映我的问题。 (意味着您也许也可以更新答案,因为现在将不再执行初始化?)
  • "所以如果你想强制执行初始化方法,你至少需要给它一个不同的时间戳。"所以这似乎是解决方案。但这也有点奇怪;)请为您提供全面的解释!
  • 在您更改的示例中,我猜您想说“self defaultParameter”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多