Exercice 1
Soit la
hiérarchie de classes suivante :
Attributs
à prévoir :
Produit : référence, désignation et prix de vente,
Pdtfab (produit fabriqué) : coût matières premières et coût main
d'oeuvre,
Pdtfabatl (produit fabriqué dans un atelier de l'usine) : nom de
l'atelier,
Pdtfabusi (produit fabriqué dans une autre usine du groupe) : nom
de l'usine,
Pdtach (produit acheté) : nom du fournisseur et prix
d’achat.
Chaque classe
doit posséder un constructeur, tous les membres "données" doivent
être renseignés dans les constructeurs.
Chaque classe
doit posséder une procédure membre affiche() qui affiche l’ensemble
des membres "données" d’un objet (bien sûr, vous utiliserez le lien
d'héritage).
Ecrire les 5
classes (description et code des méthodes) et les tester en
utilisant la classe figurant ci-dessous (la récupérer dans
\\192.168.1.2 \SIO1\Phl\SLAM4\Atelier6\Ressources…).
//classe Testpdt
class Testpdt
{
public static void main (String [] argv)
{
Pdtfabatl p1=new
Pdtfabatl("r1","crayon",5,0.5F,0.25F,"atelier1");
Pdtach p2 = new Pdtach("r2","stylo
bille",10,"Dupont",6.5F);
Pdtfabatl p3 = new Pdtfabatl("r3","stylo
feutre",8.5F,2.5F,1,"atelier2");
Pdtfabusi p4 = new
Pdtfabusi("r4","gomme",8.5F,2.5F,1,"Seclin");
p1.affiche();
p2.affiche();
p3.affiche();
p4.affiche();
System.out.println("");
Produit tab[]=new Produit[4];
tab[0]=p1;
tab[1]=p2;
tab[2]=p3;
tab[3]=p4;
for (int i=0;i<4;i++)
tab[i].affiche();
}
}
Qu'en déduisez-vous ?
Exercice 2
On veut gérer
des figures géométriques (on se limite aux carrés et aux
rectangles).
Un Carré a une
seule donnée : le côté qu'on pourra nommer longueur.
Un Rectangle a
2 données : une longueur et une largeur.
Rectangle
hérite de Carré.
On souhaite
pouvoir utiliser pour chaque figure : une fonction longueur(),
une fonction largeur(), une fonction surface() et une fonction
périmètre().
Construire les
classes Carré et Rectangle et écrire leurs méthodes.
Ecrire une
classe permettant le test des classes Carré et
Rectangle.
Remarque :
en mathématiques, c’est le carré qui est un cas particulier du
rectangle. Dans cet exercice, nous considérons que c’est le
rectangle qui est une spécialisation du carré car le rectangle a
une donnée spécifique : la 2ème
dimension.
Exercice 3
Le JDK fournit
des classes pour traiter les dates mais vous souhaitez créer votre
propre classe de traitement de dates sans avoir à réécrire tous les
traitements.
Créer la classe
DateFr dérivée de GregorianCalendar offrant les méthodes permettant
:
·
de construire une date à partir du
jour, du mois et de l'année sur 4. Pour l'instant, nous ne ferons
aucun contrôle sur les données envoyées au constructeur (le
constructeur de GregorianCalendar ne fait pas de contrôle non
plus).
·
de retourner la date en format court
jj/mm/aaaa ou long jj libellémois aaaa ou très long
(idem long avec en plus le jour de la semaine). Pour cela, vous
écrirez une fonction RendDateFr(donnée : format : entier) //
paramètre à 1, 2 ou 3 selon le format désiré.
·
de retourner le nom du
jour.
·
de retourner le nom du
mois.
·
de retourner l'année.
·
de retourner le n° du jour de la
semaine.
·
de retourner le n° du
mois.
·
de retourner le
quantième.
Ecrire
une classe pour tester la classe DateFr.
LES CLASSES ABSTRAITES
LE POLYMORPHISME
Exercice
1
Reprendre
l'exercice des produits (exercice 1 TP Atelier 6 1ère
partie).
1. Que produit
le dernier affichage de la classe Testpdt.java ? Pourquoi
?
2. Certaines
classes ne doivent pas être instanciées. Faire le
nécessaire.
Exercice
2
Reprendre les
classes relatives aux animaux, ayant servi à illustrer le cours
(les récupérer sur Echange) et écrire une classe de test qui
:
. crée un
tableau d'animaux,
. permet à
l'utilisateur de "créer" des animaux (oiseau, chien ou chat) avec
bien sûr saisie des informations nécessaires, le traitement de
création devra prendre fin à l'initiative de l'utilisateur ou dès
que le tableau est rempli,
.
affiche la classe, le prénom et le cri de chaque animal
"créé". Pour chaque mammifère, il faudra en plus afficher sa
race (il n'y a aucune méthode d'affichage à écrire).
Remarque :
ce qui figure en italique (et rouge ?) est facultatif (pour le
faire, il faut lire l'annexe).
Annexe
Tester la classe d'un
objet
a. Tester si un objet appartient à
une classe
Il faut d'abord considérer qu'un
objet d'une classe dérivée appartient à sa classe bien sûr mais
également à l'ensemble des classes mères de sa classe.
On va utiliser la méthode
isInstance(NomObjet)
qui s'applique à un
objet de type Class.
Exemple : si on veut savoir si
Milou et Nestor sont des mammifères :
if
(Mammifère.class.isInstance(milou))
// rend vrai que Milou soit désigné par une référence de type
Animal
// ou de type Chien
System.out.println ("Milou est un mammifère");
else
System.out.println ("Milou n'est pas un mammifère");
if (Mammifère.class.isInstance(nestor))
// rend
faux
System.out.println ("Nestor est un mammifère");
else
System.out.println ("Nestor n'est pas un mammifère");
On aurait pu écrire :
Class c =
Mammifère.class;
if
(c.isInstance(milou))
// rend vrai que Milou soit désigné par une référence de type
Animal
// ou de type Chien
System.out.println ("Milou est un mammifère");
else
System.out.println ("Milou n'est pas un mammifère");
if (c.isInstance(nestor))
// rend
faux
System.out.println
("Nestor est un mammifère");
else
System.out.println ("Nestor n'est pas un mammifère");
Bien sûr, ici on connaît d'avance la
réponse mais on voit qu'il sera utile de tester la classe si on
traite par exemple un tableau d'objets d'une hiérarchie et qu'on
souhaite effectuer tel traitement uniquement pour les instances de
l'une des classes.
- Connaître la classe précise d'un
objet
On va utiliser la méthode
getClass() qui s'applique à un objet de n'importe quelle
classe.
Exemple : on veut tester si la
classe de Milou est la classe Chien :
if (milou.getClass() == Chien.class)
System.out.println
("Milou est bien un chien");
Exemple
: on veut afficher le nom de la classe de Milou et de
Nestor:
System.out.println ("Classe de Milou = " +
milou.getClass().getName());
System.out.println ("Classe de Nestor = " +
nestor.getClass().getName());
Remarque : pour connaître le nom de la
classe, il faut appliquer la méthode getName() au résultat de la
méthode getClass().