Exercices dirigés n 5 Design Pattern Composite : étant données 2 schémas de classes représentant des exemples de formes possibles : public class Cercle{ private Point centre; private double rayon; private Color couleur; public Cercle(Point p,double r,color c){ centre = p; rayon = r; couleur = c; public void sedessiner(){// connaissance du code indispensable public class Polygone{ private Point[] sommets; private Color couleur; public Polygone(Point[] s,color c){ sommets = s; couleur = c; public void sedessiner(){// connaissance du code indispensable et une classe Dessin capable de dessiner un ensemble de formes. Elle devra rester invariante en cas d'introduction de nouvelles formes. public class Dessin{ private Vector<Forme> elements; public void ajouter(forme f){ if(elements == null) elements = new Vector<Forme>(); elements.add(f); Compléter, modifier ce programme pour faire en sorte de pouvoir dessiner n'importe quel dessin quelles que soient les formes qui le composent. On aura ainsi créé un schéma de conception unique tel qu'une classe quelconque composée d'un nombre quelconque d'objets présentant des fonctionnalités communes pourra appliquer ces fonctionnalités à chacune d'entre elles. public class Polygone extends Forme public class Cercle extends Forme public abstract class Forme{ protected abstract void sedessiner(); Dans la classe Dessin, introduire la méthode : public void dessiner(){ for( Forme f : elements ) f.sedessiner(); 1
Compléter ce programme en remplaçant les points de suspension par le code adapté en ayant en tête d'utiliser au maximum les possibilités offertes par l'héritage. class Point{ protected int x; protected int y; public Point(int x, int y){... public void deplacer(int dx, int dy){ x=x+dx; y=y+dy; System.out.println"(position du point : x = "+x+", y = "+y); class PointZCouleur extends Point{ private int z; private Color c; public PointCouleur(int x,int y,int z,color c){... public void deplacer(int dx,int dy){....; System.out.println"(couleur du point : "+c+", z = "+z); public Point(int x, int y){ this.x;this.y; public PointCouleur(int x,int y,int z,color c){ super(x,y);this.z;this.c; public void deplacer(int dx,int dy){ deplacer(dx,dy); super.ou(); System.out.println"(couleur du point : "+c+", z = "+z); Considérant le programme suivant : interface Personne{ public void quiestu(); public Personne complements(); abstract class PersonneAbstraite implements personne{ public void quiestu(){ System.out.print("Je suis "); class Femme extends PersonneAbstraite{ public void quiestu(){ super.quiestu(); System.out.println("une femme"); public Personne complement(){ return new Homme(); class Homme extends PersonneAbstraite{ 2
public void quiestu(){ super.quiestu(); System.out.println("un homme"); public Personne complement(){ return new Femme(); Compléter la classe Test en remplaçant les commentaires par le code adapté : class Test{ // Création d'un tableau constitué de 2 hommes et de 2 femmes // Parcourir ce tableau et afficher le statut (méthode quiestu()) // de chaque élément ainsi que le statut de son complément. // Afficher aussi le message suivant seulement s'il s'agit d'une // femme : " Je suis blonde " (vous pouvez changer le message) Personne [] p = new Personne[2]; p[0] = new Femme(); p[1] = new homme(); for( int i=0;i<2;i++){ p[i].quiestu(); p[i].complement().quiestu(); if( p[i] instanceof Femme ) System.out.println(" Je suis blonde "); Quel est le résultat de l'exécution de ce programme (C2.java)? Le constructeur sans paramètre de la classe Object est-il invoqué lorsque new B(5)est exécuté : public class C2{ B b = new B(5); class A{ public A(){ System.out.println("Je suis dans A "); public B(int x){ System.out.println("Je suis dans B"); Je suis dans A Je suis dans B 3
ED n 5 Quels sont les problèmes identifiés à la compilation dans ce fichier source (C3.java): public class C3{ B b = new B(); class A{ public A(int x){ System.out.println("Je vaux: "+x); public B(){ System.out.println("Je suis dans B"); A la compilation de la classe B, le constructeur A()n'est pas trouvé. La classe B peut-elle être compilée? Quelle que soit la réponse, déterminer le modificateur le plus adapté aux membres i et m de la classe A? // fichier A.java package p1; public class A{ int i; void m(){ System.out.println("i= "+i); // fichier B.java package p1; public void main(string[] args){ System.out.println("i= "+i); m(); La classe B peut être compilée car ses membres i et m()sont visibles dans tout le package, toutefois, la visibilité la plus stricte est : protected int i; protected void m(){... Les assertions suivantes sont elles vraie ou fausse? - un membre protected (donnée ou méthode) peut-il être accédé par n'importe quelle classe du même package? - un membre protected (donnée ou méthode) peut-il être accédé par n'importe quelle classe de différents packages? - un membre protected (donnée ou méthode) peut-il être accédé par ses sous-classes de différents packages? 4
- une classe final peut-elle être instanciée? - une classe final peut-elle être étendue (dérivée)? - une méthode final peut-elle être redéfinie? oui oui Elle peut être surchargée mais pas redéfinie Déterminer 2 façons de compléter le programme suivant pour que le constructeur de la classe B initialise les variables d'instance x et y : public class A{ protected int x,y; public A( int x,int y ){ this.x = x;this.y = y; private int r; public B( int x,int y,int r ){ this.r = r; super(x,y); this.x;this.y; 5