L'entité n'est désormais plus responsable de son dessin.
Conformément au diagramme de classes, elle possède une composition avec un objet
implémentant le trait
Shape.
En Rust, lorsqu'un objet est manipulé à travers un trait, il faut indiquer
explicitement que l'on souhaite utiliser le polymorphisme dynamique.
On utilise alors le mot-clé
dyn.
On pourrait donc être tenté d'écrire :
Cependant, cette écriture est impossible.
Un objet de type
dyn Shape n'a pas de taille connue à la compilation,
alors que tous les champs d'une structure doivent avoir une taille fixe.
Il faut donc placer l'objet derrière un pointeur de taille connue :
Box est un pointeur propriétaire : l'objet est alloué sur le tas (
heap)
et appartient à
Entity, conformément à la relation de composition du diagramme
de classes.
La taille du champ
shape est alors simplement celle du pointeur, que le
compilateur connaît.
Cette modification a plusieurs conséquences sur la structure
Entity :
- le constructeur doit recevoir un objet
{TT|Box<dyn Shape>} et
l'initialiser correctement ;
- la méthode draw() ne dessine plus directement l'entité : elle délègue cette
opération à l'objet référencé par shape ;
- la méthode click() doit désormais obtenir le rayon du cercle englobant en
invoquant bounding_radius() sur shape.
Les attributs propres à la forme graphique (dimensions et rayon du cercle englobant)
n'ont donc plus leur place dans
Entity.
Le constructeur ayant changé, adaptez également la fonction
create_window() du
fichier
lib.rs.
Avant de créer chaque entité, instanciez un
Rectangle, placez-le dans un
{TT|Box<dyn Shape>} et transmettez-le au constructeur de
Entity.
Les rectangles auront une largeur et une hauteur aléatoires comprises entre 50
et 100.
Faites en sorte que la moitié d'entre eux soient pleins et l'autre moitié
dessinés sous forme de contour.
Lisez bien la fonction
create_window() : vous disposez déjà de toutes les
informations nécessaires.
À l'issue de cette étape, la fenêtre doit afficher 8 rectangles pleins et 8
rectangles vides, tous animés et interactifs.