#objective-c #smalltalk #metaclass
#objective-c #smalltalk #метакласс
Вопрос:
Насколько я понимаю, сложно создавать конструкторы классов в Smalltalk и Objective-C. Это связано с тем, что конструктор не может быть сообщением экземпляра класса, поскольку класс Class еще не определен.
Насколько я могу судить, решение заключается в создании нового класса, единственный экземпляр которого сам по себе является классом. Но как конструктор работает в этой ситуации? Я не понимаю процесс.
Комментарии:
1. Вам нужно будет показать какой-нибудь код или уточнить вопрос, пожалуйста.
Ответ №1:
Я говорю в терминах Smalltalk. Есть два типа вещей, которые вы могли бы разумно назвать конструкторами здесь. Одним из них является метод, который инициализирует новый экземпляр класса. Другой — это то, что инициализирует класс. Ни один из них не является сложным.
Например, при инициализации соглашение заключается в том, что вы реализуете метод «new» в классе как new ^ super new инициализируете (выполняете реализацию суперкласса new, а затем отправляете сообщение «initialize» результату и возвращаете его), многие классы могут уже наследовать эту реализацию, поэтому вам просто нужно написать метод инициализации как
инициализировать суперинициализацию. foo := 1. и т.д.
Механизм инициализации нового класса аналогичен. Вы реализуете метод класса с именем «initialize», и он будет автоматически отправлен при загрузке класса в новую среду Smalltalk (изображение).
Ответ №2:
Решение состоит в том, чтобы создать метод в классе, который выполняет всю необходимую инициализацию экземпляра.
Комментарии:
1. Точно. Например, в Cocoa / OpenStep (Objective-C)
[NSObject allocWithZone:]
отвечает за построение объекта, а затем один из-init
методов отвечает за заполнение его полей.