septembre
2008
Le modèle objet de dodo repose sur le prototype, comme nous avons vu dans la première partie.
Nous allons maintenant voir comment dodo interprète la notion de classe, un classique de programmation orientée objet, en terme de prototypes.
Classe
Une classe définit un modèle auquel tous les objets instance de la classe répondent. En pratique, une classe dodo définit des attributs et fonctions membres de la classe ainsi qu’un prototype. Les objets instance de la classe dérivent de ce prototype.
Le nom d’une classe commence toujours avec une lettre majuscule.
Un exemple de classe serait Maison
, dont maisonDesDupont
serait une instance. Le prototype sur lequel est basé maisonDesDupont
est Maison.instance
, comme les autres objets instance de la classe.
La classe est elle-même un objet qui peut avoir des attributs et fonctions membres. Par exemple, instance
est un attribut standard d’une classe.
Une classe possède également des constructeurs et des fonctions fabrique d’objet.
Constructeur
Un constructeur initialise un objet instance de la classe. Si l’attribut instance
de la classe n’est pas défini et qu’il existe un constructeur sans paramètre, dodo utilise ce constructeur pour créer l’attribut instance
de la classe lorsque celle-ci est chargée en mémoire. Par exemple:
class Maison { Fenetre[] fenetres Couleur couleurMur, couleurToit make Maison() { .fenetres = [Fenetre()] .couleurMur = blanc .couleurToit = rouge } }
Quand la classe Maison
est chargée en mémoire, son attribut instance est initialisé en appelant le constructeur Maison()
qui l’initialise avec une fenêtre, des murs blancs et un toit rouge.
Fonction fabrique
Une fonction fabrique d’objet est une fonction de classe qui renvoie un objet instance de cette classe en fonction de certains paramètres. Par convention, le nom d’une fonction fabrique d’objet commence avec new
. Par exemple on pourrait définir une fonction Maison.newAvecMurEtToit(Couleur,Couleur)
.
Héritage
Une classe est elle-même un objet, qui utilise le modèle à base de prototype comme tout objet dodo. Une classe hérite d’une superclasse quand elle utilise cette superclasse comme prototype. La superclasse peut être une autre classe ou bien le type d’un objet.
La classe hérite des attributs, fonctions membres et autres propriétés de la superclasse. Le prototype des objets instance de la classe dérive du prototype utilisé (la superclasse est un objet) ou de l’attribut instance
de la superclasse (la superclasse est une classe).
Une classe ne peut avoir qu’une seule superclasse, mais on peut lui appliquer plusieurs traits.
Trait
En plus de la notion de prototype et de classe, dodo a celle de trait (feature). Un trait s’applique à un objet ou à une classe pour lui définir des propriétés supplémentaires. Par exemple un nombre entier possède le trait Arithmetic
qui lui apporte l’addition, la multiplication etc. ainsi que le trait Ordered
(ordonné).
Un trait se définit de la même façon qu’une classe, mais il n’y a pas d’instance, de constructeur ou de fonction fabrique d’objet dans un trait.
Polymorphisme
Le polymorphisme permet de faire abstraction du type exact d’un objet pour n’en retenir que les propriétés générales. Un exemple typique de polymorphisme est une fonction qui attend un paramètre de type FormeGeometrique, où le paramètre peut être tour à tour un carré, un cercle, un trapèze…
Pour bénéficier du polymorphisme, le type de l’objet doit hériter de class
ou de Object
ou bien répondre au trait Polymorphic
.
Conclusion
Pour un rapport complet du modèle objet de dodo il faudrait également évoquer les patrons (templates), les fonctions de conversion, les états abstraits et d’autres apports.
En l’état, on peut déjà voir toutes les possibilités qui s’ouvrent au programmeur sur la base d’un concept simple (le prototype) que le langage reprend sous diverses formes pour donner les outils familiers de la programmation orientée objet.
Merci de visiter mon blog
Je viens de revisiter le modèle objet de dodo et j’espère pouvoir te répondre plus en détail.
Il est vrai qu’une classe est un objet mais elle est traitée de façon spéciale, du fait de la distinction variable commence avec minuscule / classe commence avec majuscule.
Une classe est caractérisée par un prototype pour tous les objets de la classe, un ensemble de constructeurs, d’attributs de classe, de fonctions et types membres et une interface. Cela se reflète dans le type d’une classe.
Certes mais j’interprète la notion d’héritage en termes de prototypes, c’est l’objet de cet article. L’objet délégué en question est le prototype utilisé comme base pour tous les objets de la classe. Comme ce prototype est généralement une instance de la superclasse, les messages sont en pratique délégués à la superclasse.
On ajoute des attributs et méthodes à un objet ainsi:
Pour une classe la syntaxe est la même, seulement avec des majuscules.
Dodo is object-oriented, prototype-based and statically typed.
J’aimerais bien une explication plus détaillée sur le système de types de dodo.
Si une classe est elle-même un objet alors quel est le type de cet objet ? Une classe étant un objet on peut la créer dynamiquement. Mais une classe est aussi un type (le type de ses instances), on peut donc créer des types dynamiquement. D’où la question du typage: comment typer statiquement un langage dans lequel les types sont crées dynamiquement ?
D’un point de vue vocabulaire je ne pense pas que dodo soit un véritable langage à prototypes. Dans un langage à prototypes il n’y a pas d’héritage, chaque objet possède un (ou plusieurs) objets délégués auquel il renvoie les messages qu’il ne peut pas interpréter.
De plus il n’est pas dit comment ajouter dynamiquement des attributs et méthodes à un objet. Ça me paraît pourtant indispensable sinon comment va-t-on créer de nouvelles classes ? Puis encore la même question de typage: comment typer statiquement un langage dans lequel les attributs et méthodes sont ajoutées dynamiquement ?
(je m’excuse par avance de n’avoir pas lu toute la documentation disponible qui éventuellement pourrait apporter des réponses à mes interrogations)