метакласс и конструкторы

#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 методов отвечает за заполнение его полей.