4

このクラスを含む 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 をロードし、次にバージョン 2 をロードすると、バージョン 2 は間違ったデフォルトになります。

したがって、このクラスを含む Monticello パッケージがイメージに読み込まれるときにクラスで呼び出されるメソッドが存在することを願っています。これにより、クラスを再初期化できます。ありますか?この問題の別の解決策はありますか?

4

1 に答える 1

3

はい、MC パッケージをロードするときに実行される特定のメソッドがありますinitialize

initializeより正確には、メソッドが既に画像にあるものと異なる場合に実行されます。MC はこれらのクラス初期化子を特別に扱います (Monticello の代わりに変更セットを使用する場合に特別に扱われるのと同じように)。

したがって、あなたの例では、すべて問題ありません。の 2 番目のバージョンをロードするinitializeと、それが実行されます。(編集:あなたの例を更新したので、初期化自体は変更されていません。次の段落のアドバイスに従う必要があります)。

ただし注意してください: 別のパッケージ バージョンにまったく同じinitializeクラス メソッドがある場合、それは再度実行されません。これは、Monticello がパッケージをロードするときに、イメージ内のものとは異なるメソッドと、ロード バージョンが提供するもののみを考慮するためです。したがって、メソッドの実行を強制したい場合はinitialize、少なくとも別のタイムスタンプを与える必要があります。

于 2013-02-13T12:10:49.103 に答える