Разница между новым и инициализировать в Smalltalk? - PullRequest
8 голосов
/ 17 апреля 2011

Вопрос новичка, в чем разница между new и initialize?

Ответы [ 3 ]

8 голосов
/ 17 апреля 2011

Точно. Когда вы отправляете сообщение #new, он не только создает объект, но и отправляет сообщение #initialize. Это позволит вам настроить инициализацию объектов. Посмотрите:

Behavior >> new
"Answer a new initialized instance of the receiver (which is a class) with no indexable variables. Fail if the class is indexable."

^ self basicNew initialize

А потом:

 ProtoObject >> initialize
"Subclasses should redefine this method to perform initializations on instance creation" 

И

   Behaviour >> basicNew
"Primitive. Answer an instance of the receiver (which is a class) with no 
indexable variables. Fail if the class is indexable. Essential. See Object 
documentation whatIsAPrimitive."

<primitive: 70>
self isVariable ifTrue: [ ^ self basicNew: 0 ].
"space must be low"
OutOfMemory signal.
^ self basicNew  "retry if user proceeds"

Итак ... # basicNew - это примитив, который создает объект. Обычно вы используете #new, и если вам не нужно ничего особенного, вы не реализуете #initialize и, следовательно, будет выполнена пустая реализация #ProtoObject. В противном случае вы можете напрямую отправить #basicNew, но, вероятно, вам не следует этого делать.

Приветствия

5 голосов
/ 17 апреля 2011

С помощью new вы создаете новый объект, в то время как метод initialize выполняется при создании нового объекта и инициализирует объект.

3 голосов
/ 17 апреля 2011

Бавария верна.

Behavior >> new
        "Answer a new instance of the receiver.  If the instance can have indexable variables, it will have 0 indexable variables."

        "Primitive fails if the class is indexable."
        <primitive: 70>
        self isVariable ifTrue: [^self new: 0].
        self primitiveFailed

Object >> initialize
    "Initialize the object to its default state. This is typically used in a convention that the class implements the #new method to call #initialize automatically. This is not done for all objects in VisualWorks, but the initialize method is provided  here so that subclasses can call 'super initialize' and not get an exception."

    ^self.
...