Exercices dirigés n°5

Transcription

Exercices dirigés n°5
ED n°5
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 non 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 non 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.
Solution
public
public
class Polygone extends Forme
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
ED n°5
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;
}
public void ou(){
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){
....
}
public void ou(){
….;
System.out.println"(couleur du point : "+c+", z = "+z);
}
}
Solution
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);
}
public void ou(){
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
ED n°5
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{
public
static void main(String[] args){
// 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)
}
Solution
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{
public static void main(String[] args){
B b = new B(5);
}
}
class A{
public A(){
System.out.println("Je suis dans A ");
}
}
public class B extends A{
public B(int x){
System.out.println("Je suis dans B");
}
}
Solution
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{
public static void main(String[] args){
B b = new B();
}
}
class A{
public A(int x){
System.out.println("Je vaux: "+x);
}
}
public class B extends A{
public B(){
System.out.println("Je suis dans B");
}
}
Solution
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 class B extends A{
public void main(String[] args){
System.out.println("i= "+i);
m();
}
}
Solution
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
ED n°5
- 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 ?
Solution
non
non
oui
oui
non
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;
}
}
public class B extends A{
private int r;
public B( int x,int y,int r ){
this.r = r;
}
}
Solution
super(x,y);
this.x;this.y;
5