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();
}
}
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.
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.
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().