8
votes

Différence entre les nouveaux et initialiser dans Smalltalk?

Une question de débutante, quelle est la différence entre les nouveaux et les initialistes?


0 commentaires

3 Réponses :


5
votes

avec neuf Vous créez un nouvel objet, tandis que la méthode d'initialisation est exécutée lorsque le nouvel objet est créé et initialise l'objet.


0 commentaires

9
votes

exactement. Lorsque vous envoyez le message #New, cela crée non seulement l'objet, mais envoie la messagge #Imitialize. Cela vous permet de personnaliser l'initialisation des objets. REGARDER:

   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"


3 commentaires

Bien que certains dialectes envoient initialize sur neuf , ce n'est pas vrai pour SmallTalk-80.


Je crois que j'ai vu des exemples où les gens mettent le code d'initialisation dans la classe MyClass >> Nouveau plutôt que MyClass >> Initialiser, pourquoi feriez-vous cela s'ils sont essentiellement invoqués à la fois?


@OYKUO - >> INITIALIZE est envoyé à l'objet Réputé par >> Nouveau (pas l'objet Le message >> Nouveau a été envoyé à). >> Initialiser a accès aux Insctivars qui n'existaient peut-être pas avant >> Nouveau qui a été envoyé. (Peut-être que vous pensez à l'initialisation de la classe?)



3
votes

Bavarieux est correct.

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.


1 commentaires

Cela correspond également à ALLOC-C'S Alloc-Init Motif: MyOBJ: = [[[NSOBJECT ALLOC] init] . Pas terriblement surprenant que :)