Vous êtes sur la page 1sur 3

L3 SPI

Programmation orientée objet sous Java- TP 2- Octobre 2022

Aspects avancés de la programmation orientée objet sous Java

But
Aborder des aspects avancés de l’orienté objet (l’héritage, le polymorphisme, etc.) afin de les mieux comprendre.

Remarques
— Ce TP (de 6 heures) est noté. Il faut donc préparer un compte rendu papier à rendre à la fin de la deuxième
séance.
— Vous pourrez vous organiser en binômes. Dans ce cas, un seul compte-rendu est à rendre. Ne pas oublier de
renseigner les noms (un oubli entraı̂ne la note de 0 / 20).
— Les codes à compléter pour la question qi se trouvent dans le répertoire suivant :
~saidi/l3spi/java/tp2/qi/source
— Le bytecode de l’application de la question qi (remplacez i par 1 ou 2) se trouve dans le répertoire suivant :
~saidi/l3spi/java/tp2/qi/bytecodes
— Pour copier le répertoire des TP2 dans le répertoire où vous vous trouvez (répertoire $PWD), il suffira d’exécuter
la commande suivante :
cp -r ~saidi/l3spi/java/tp2/ .

Question 1 Dans le fichier Point.java est illustrée une classe Point permettant de gérer les points dans un repère
à deux dimensions. Cette classe est munie de :
— un constructeur Point (double x, double y) permettant d’initialiser les coordonées cartésiennes x et y,
— deux méthodes d’accès et deux méthodes d’altération permettant l’accès et la modifications des champs privés x
et y (correspondant aux coordonnées cartésiennes du point),
— une méthode deplace (double dx, double dy) permettant de déplacer le point suivant les deux paramètres
dx et dy,
— une méthode affiche () permettant d’afficher sur la console les valeurs des coordonnées du point,
— une méthode distance (Point point) calculant la distance euclidienne vers un point donné en paramètre,
— une méthode de classe distance (Point point1, Point point2) servant à calculer la distance entre deux
points fournis en paramètres.
L3 SPI

Définissez une nouvelle classe Point3D étendant la classe Point (la classe Point3D doit hériter de la classe Point),
de telle sorte à offrir dans l’espace (repère à 3 dimensions) les mêmes services que ceux proposés par la classe Point. Le
canevas de la classe Point3D est illustré sur dans le fichier Point3D.java alors que la classe TstDesPoints illustrée
dans le fichier TstDesPoints.java permet de tester les deux classes Point et Point3D.
Complétez la classe Point3D.
Y a-t-il des méthodes redéfinies dans la classe Point3D ? Si oui, énumérez-les. Pour chacun des deux appels de la
méthode de classe void test (), indiquez les méthodes appelées sous forme Classe.NomMéthode (Paramètres).

Question 2 Afin de manipuler diverses formes graphiques, nous définissons une nouvelle classe Forme utilisant la
classe Point de la question 1. Son corps est illustré dans le fichier Forme.java.
Trois formes graphiques ont été créées :
1. Cercle qui hérite de la classe Forme et dont la définition complète est illustrée dans le fichier Cercle.java.
Cette classe permet de représenter un cercle sur un plan à deux dimensions.
2. Rectangle qui hérite de la classe Forme et dont la définition (voir le fichier Rectangle.java) est à compléter.
Cette classe permet de représenter un rectangle sur un plan à deux dimensions, grâce à ses deux coins supérieur
gauche et inférieur droit.
3. Triangle qui hérite de la classe Forme et dont la définition (voir le fichier Triangle.java) est à compléter.
Cette classe permet de représenter un triangle sur un plan à deux dimensions en énumérant ses trois sommêts.
Redéfinissez la méthode String toString () héritée de la super classe Object de java de telle sorte à obte-
nir les affichages suivants, suite à l’exécution de la méthode String main() de la classe TstFormes (voir le fichier
TstFormes.java).
Affichage des diverses formes graphiques sur la console :
Forme 0 : Je suis un reclangle de coin supérieur gauche (1.0, 2.0) et de coin inférieur droit gauche (1.4, 5.0)
Forme 1 : Je suis un cercle de centre (3.0, 4.0) et de rayon 10.0
Forme 2 : Je suis un cercle de centre (3.0, 4.0) et de rayon 5.0
Forme 3 : Je suis un triangle aux trois sommêts {(1.0, 2.0), (5.7, 0.0), (0.0, 3.0)}
Fin de l’affichage des formes

Question 3 Définissez une classe publique Medicament disposant de :


— un champ privé : denominationCommerciale (denominationCommerciale de type String),
— un champ privé : ordonnanceExigee (ordonnanceExigee de type boolean) indiquant si ce médicament peut ou
pas être vendu sans ordonnance médicale,
— un champ privé : indications (indications de type String) qui précise dans quels cas utiliser le médicament
(quelles maladies il traite),
— un champ privé : contreIndications (contreIndications de type String) qui précise dans quels cas ne pas
utiliser le médicament,
— un champ privé : prix (prix de type double) précisant le prix de base du médicament (hors réduction),
— un constructeur public permettant d’initialiser les 5 champs précédents,
— une méthode publique abstraite (à ajouter directement dans votre code)
public String getCategorie () ;
— deux méthodes d’accès aux champs privés denominationCommerciale et prix.
L3 SPI

Créez maintenant deux sous-classes Antalgique et AntiInflammatoire de la classe Médicament. Ces deux sous-
classes doivent redéfinir en public les méthodes getCategorie () et getPrix() de telle sorte qu’elles retournent :
1. Pour la méthode getCategorie () :
— classe Antalgique : retourner la chaine de caractères “Antalgique”,
— classe AntiInflammatoire : retourner la chaine de caractères “anti-inflammatoire”.
2. Pour la méthode getPrix() :
— classe Antalgique : retourner la valeur du champ prix (qui est de type double),
— classe AntiInflammatoire : retourner la valeur du champ prix multipliée par 0.65.
En outre, les deux sous-classes Antalgique et AntiInflammatoire doivent disposer chacune d’un constructeur
permettant d’initialiser tous les champs hérités de la classe de base.
Ajoutez une classe Test permettant de tester vos classes. Cette classe Test doit définir la méthode statique main
() dans laquelle vous devriez :
— déclarer un tableau tabMedicaments de 2 médicaments (classe Medicament). Affectez à la première case du ta-
bleau un objet de la classe Antalgique. Les cinq champs de ce premier médicament sont : denominationCommerciale
= “Paracétamol”, ordonnanceExigee = false, indications =
“Traitement symptomatique des douleurs d’intensité légère à modérée et/ou des états
fébriles, etc.”, contreIndications = “Insuffisance hépatocellulaire, etc.” et prix = 20. La se-
conde case du tableau contiendra un objet de la classe AntiInflamatoire. Les cinq champs de ce second
médicament sont : denominationCommerciale = “Advil”, ordonnanceExigee = false, indications = “Traitement
symptomatiques des affections douloureuses d’intensité légère à modérée et/ou des états fébriles.”,
contreIndications = “Antécédents d’hémorragie ou de perforation digestive au cours d’un précédent
traitement par AINS, etc.” et prix = 2.60.
— afficher les prix des deux articles stockés dans le tableau tabMedicaments en passant par instruction de boucle
for.

Vous aimerez peut-être aussi