Solutions au TD 1

Exercice 1 : SimpleNamedPoint.java

Exercice 2 : SimpleNamedPoint.java et Test.java

Exercice 3 : SimpleNamedPoint.java et Test.java

Remarques sur l'exercice 3 :
Dans un premier temps, on essaye de modifier la définition de SimpleNamedPoint ainsi :

public class SimpleNamedPoint implements NamedPoint, Drawable

et sur le même modèle, on peut considérer d'autres classe, par exemple, RoundNamedPoint.java et RectangleNamedPoint.java, ce qui permet une séquence d'instructions comme :

    NamedPoint p1 = new SimpleNamedPoint("top", 100, 20);
    Collection<NamedPoint> c1 = new LinkedList<NamedPoint>();
    c1.add(p1);
    c1.add(new RoundNamedPoint("left", 30, 100));
    c1.add(new RectangleNamedPoint("right", 150, 100));
    printNames(c1);

    Drawable p2 = new SimpleNamedPoint("top", 100, 20);
    Collection<Drawable> c2 = new LinkedList<Drawable>();
    c2.add(p2);
    c2.add(new RoundNamedPoint("left", 30, 100));
    c2.add(new RectangleNamedPoint("right", 150, 100));
    new Drawing(c2);

mais il est impossible de construire une seule collection qui puisse être passée en paramètre à la fois à printNames et au constructeur de Drawing. On y parvient en définissant :

interface DrawableNamedPoint extends NamedPoint, Drawable {}
class SimpleNamedPoint implements DrawableNamedPoint {...}
class RoundNamedPoint implements DrawableNamedPoint {...}
class RectangleNamedPoint implements DrawableNamedPoint {...}

ce qui permet :

    DrawableNamedPoint p = new SimpleNamedPoint("top", 100, 20);
    Collection<DrawableNamedPoint> c = new LinkedList<DrawableNamedPoint>();
    c.add(p);
    c.add(new RoundNamedPoint("left", 30, 100));
    c.add(new RectangleNamedPoint("right", 150, 100));

La collection c ne peut toujours pas être passée en paramètre à printNames et au constructeur de Drawing. Il faut soit, si on peut le faire, modifier le type attendu en paramètre, par exemple :

static void printNames(Collection<? extends NamedPoint> c)

ce qui permet un appel printNames(c); ou, autrement, construire une nouvelle collection avec le type attendu, par exemple :

    Collection<Drawable> cc = new LinkedList<Drawable>();
    for (Drawable d : c)
      cc.add(d);
    new Drawing(cc);

ou le raccourci :

    new Drawing(new LinkedList<Drawable>(c));

Exercice 4 : Test.java

Exercice 5 : TreeInterface.java

Exercice 6 : Tree.java et TreeNode.java

Exercice 7 : TreeDrawing.java

Exercice 8 : TreePlus.java