2009-03-12 17 views

Répondre

2

Object subclass: Foo [] n'est pas une syntaxe Smalltalk "habituelle", c'est un ajout récent conçu pour le rendre pratique à coder dans des fichiers. Avant cela, il n'y avait pas de syntaxe dédiée pour déclarer la classe, car ils seraient créés par une commande dans l'image. L'interprétation de ce code comme prévu serait mauvais pour plusieurs raisons:

  • Tout d'abord, si subclass: était un vrai message envoyé à Object, puis Foo devrait résoudre à quelque chose, ce qui est impossible, car il vient d'être déclaré . Cependant, dans les coulisses, le compilateur fait quelque chose de similaire Object subclass: #Foo#Foo est un symbole pour le nom d'une nouvelle classe à créer. Il serait possible d'écrire tout le code comme ça, sauf que vous ne pourriez pas utiliser les noms de classe directement (puisqu'ils n'existent pas encore quand le code est lu). Vous auriez à faire (Smalltalk at: #Foo) new printNl partout. Ainsi, toute la forme Object subclass: Foo [ ] est pure syntaxe qui vient déclare que cette classe doit être créée, et ne veut pas dire que, à ce moment, un message doit être envoyé à Object, etc

  • Deuxièmement, vous ne voulez pas créer des classes au milieu d'un algorithme et de leur envoyer des messages immédiatement, ce serait plutôt moche comme pratique de développement. Notez que les classes doivent être enregistrées dans le système pour que le navigateur puisse les afficher, que le compilateur puisse recompiler automatiquement les dépendances, que le contrôle de version puisse les enregistrer, etc. Aussi, que se passe-t-il si votre code double accidentellement deux fois? Devrais-tu avoir un Foo de seconde classe et oublier le précédent? Ainsi, typiquement, seul le compilateur, le navigateur et d'autres outils de méta-programmation créent de nouvelles classes, et seulement à la demande du programmeur.

+0

La création de sous-classes à la volée fonctionne bien dans java>: – milan

2

Ceci est interprété comme deux instructions. La première est

sous-classe de l'objet: Foo []

et le second est

nouvelle printNl

où la nouvelle variable est pas définie de sorte qu'il est nul.