Переопределение переменных экземпляра класса Smalltalk - PullRequest
8 голосов
/ 13 ноября 2009

Я никогда не использовал Smalltalk, но я много об этом читал, и это всегда меня заинтриговало. Я видел классные демонстрационные ролики, где программа запускается и просто изменяя методы классов, которые используют объекты программы, изменяет поведение запущенной программы. Это явно мощный материал, и я понимаю, как это может работать так, как оно работает. Я не могу точно сказать, что происходит с существующими экземплярами класса, когда вы хотите добавить, удалить или переименовать переменные экземпляра этого класса.

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

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

1 Ответ

7 голосов
/ 13 ноября 2009

Согласно этой статье , это как вы сказали:

Он также автоматически управляет переопределением класса, гарантируя согласованность системы с точки зрения структур объектов и предотвращая конфликты имен, особенно конфликты имен переменных экземпляра. Когда определение класса изменяется, существующие экземпляры должны быть структурно изменены, чтобы соответствовать определению их нового класса. Вместо изменения существующего объекта ClassBuilder создает новый объект с правильной структурой (т. Е. Из нового класса, который заменяет старый). Затем он заполняет этот новый объект значениями старого. ClassBuilder использует примитив становится: (см. 2.1.1) для продолжения структурных изменений, заменяя старые объекты новыми во всей системе.

...