2013-09-27 5 views
3

У меня есть класс с переменной экземпляра 'a'.Когда инициализация вызывается в smalltalk?

Когда я создаю новый экземпляр класса с использованием нового, каков порядок вызываемых методов?

Как объект узнает, что он должен вызвать метод initialize?

Если я создаю метод класса для назначения значений моим переменным экземпляра, будет ли вызываться инициализация для других переменных экземпляра, которые не вызываются методом класса?

ответ

7

initialize обычно вызывается методом new.

Я считаю, что стандартная реализация:

new 
    ^self basicNew initialize 

#basicNew является примитивом, который просто создает объект, но не делает никакой инициализации. Все переменные экземпляра будут равны нулю после basicNew.

Обратите внимание, что метод инициализации не вызывается автоматически во всех реализациях Smalltalk (но я не знаю, какие из них этого не делают), поэтому, если вы хотите быть должным образом переносимым, вы должны переопределить #new в своих классах для его прямого вызова.

1

Стюарт ответил на это отлично. Но если вы все еще сомневаетесь в своем втором вопросе:

Если я создаю метод класса для назначения значений моим переменным экземпляра, будет ли вызываться инициализация для других переменных экземпляра, которые не вызываются методом класса?

Если вы используете что-то вроде Конструктор Метод Параметр идиомы Кента Бека, например, в Pharo, где #initialize отправляется из #new (как описано ответ Стюарта):

Point class>>x: xNumber y: yNumber 
    ^self new 
     setX: xNumber 
     y: yNumber 

Point>>setX: xNumber y: yNumber 
    x := xNumber. 
    y := yNumber. 
    ^self 

Тогда первый ваш метод инициализации будет вызываться и только после этого ваш Будет указан метод конструктора параметра.

+1

Обратите внимание, что класс (который является объектом A) не может напрямую записываться в экземпляр (который является другим объектом B). Единственный способ для A - отправить сообщение B. В любом случае A сначала должен создать B, а затем правильно инициализировать. Конструктор для меня - это то, что выполняет два ops (create + initialize) атомарно. Когда новые инициализируются, унифицированный basicNew скрыт, поэтому мы можем поддерживать иллюзию правильного конструктора. Чтобы избежать инициализации дважды для других сообщений, таких как x: y: мы скорее отправляем Point basicNew setX: y :, хотя для Point Integer >> @ часто является примитивным и, следовательно, атомарным. –

+0

Да, и, вероятно, Smalltalk Kent Beck использовал при написании шаблонов * Smalltalk Best Practice Patterns * по умолчанию не вызывал '# initialize' через' # new'. – MartinW

Смежные вопросы