Метакласс и конструкторы
Насколько я понимаю, сложно создавать конструкторы классов в Smalltalk и Objective-C. Это потому, что конструктор не может быть сообщением экземпляра класса, потому что класс Class еще не определен.
Насколько я могу судить, решение заключается в создании нового класса, единственным экземпляром которого является сам класс. Но как конструктор работает в этой ситуации? Я не понимаю процесс.
2 ответа
Я говорю с точки зрения Smalltalk. Есть два типа вещей, которые вы могли бы разумно назвать конструкторами здесь. Одним из них является метод, который инициализирует новый экземпляр класса. Другое - это то, что инициализирует класс. Ни один из них не сложен.
Для инициализации экземпляра, соглашение состоит в том, что вы реализуете метод "new" в классе как new ^ super new initialize (выполните реализацию суперкласса new, а затем отправьте сообщение "initialize" результату и верните его). Много классов может уже наследовать эту реализацию, так что вам просто нужно написать метод инициализации как
инициализировать супер инициализировать. foo:= 1. и т. д.
Для инициализации нового класса механизм аналогичен. Вы реализуете метод класса с именем "initialize", и он будет автоматически отправлен при загрузке класса в новую среду Smalltalk (изображение).
Решение состоит в том, чтобы создать метод класса, который выполняет всю необходимую инициализацию экземпляра.