Я никогда не использовал Smalltalk, но я много об этом читал, и это всегда меня заинтриговало. Я видел классные демонстрационные ролики, где программа запускается и просто изменяя методы классов, которые используют объекты программы, изменяет поведение запущенной программы. Это явно мощный материал, и я понимаю, как это может работать так, как оно работает. Я не могу точно сказать, что происходит с существующими экземплярами класса, когда вы хотите добавить, удалить или переименовать переменные экземпляра этого класса.
Я не могу себе представить, как можно изменить переменные экземпляра, которые все классы используют в работающей программе, и все же ожидать, что существующие экземпляры этого класса будут функционировать правильно после этого. Возможно, я добавляю новую переменную экземпляра, которую мне нужно инициализировать и где ранее существующие методы были изменены, чтобы зависеть от этой переменной. Разве я не мог закончить с ужасной неисправностью любого работающего кода, у которого есть живые экземпляры этого класса? Или что, если значение переменной экземпляра изменилось, и теперь я ожидаю, что там будет храниться объект другого типа, чем был раньше? Есть ли какой-то механизм «апгрейда»? Или обычная практика - просто позволить предыдущим экземплярам разбиться и сгореть? Или это просто случай «мы не делаем ничего подобного на запущенных программах и не ожидаем, что они выживут?»
Единственный достаточно чистый подход, который я могу придумать, заключается в том, что когда вы изменяете определения переменных экземпляра, возможно, он фактически создает совершенно новый класс, и старые экземпляры, до изменения, продолжают нормально работать со старым определением класса ( который теперь недоступен по имени, так как имя было переопределено к новому определению класса). Возможно, это самое логичное объяснение - но так как я не нашел ничего, что напрямую объясняет этот процесс, я решил спросить здесь и посмотреть, какую забавную информацию я получил. :)