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