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
où #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.
La création de sous-classes à la volée fonctionne bien dans java>: – milan