Есть ли конкретный метод, который будет выполняться в классе, когда я загружу пакет 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 ответ

Решение

Да, есть определенный метод, который выполняется при загрузке пакета MC: initialize метод!

Чтобы быть более точным, он выполняется, если он initialize метод отличается от того, который уже есть на изображении. MC обрабатывает эти инициализаторы класса специально (так же, как они обрабатываются специально, когда вы используете наборы изменений вместо Монтичелло).

Так что в вашем примере все хорошо. Загрузка второй версии initialize заставит это быть выполненным. (Изменить: теперь, когда вы обновили свой пример, так что инициализация не изменилась сама по себе, вам нужно следовать советам в моем следующем абзаце).

Будьте осторожны: если другая версия пакета имеет точно такой же initialize Метод класса, он не будет выполнен снова. Это связано с тем, что при загрузке пакета Монтичелло учитывает только методы, отличающиеся от того, что изображено на вашем изображении, и предлагаемой загружаемой версии. Так что если вы хотите форсировать исполнение initialize метод, по крайней мере, вам нужно дать ему другую временную метку.

Другие вопросы по тегам