S01 Classes, classes abstraites, enum et interfaces

Documents pareils
Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Apprendre la Programmation Orientée Objet avec le langage Java (avec exercices pratiques et corrigés)

Programmation Objet - Cours II

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

Chapitre VI- La validation de la composition.

TP1 : Initiation à Java et Eclipse

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Chapitre 10. Les interfaces Comparable et Comparator 1

Bases Java - Eclipse / Netbeans

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

Programmation par les Objets en Java

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Sage CRM. 7.2 Guide de Portail Client

Cours 1: Java et les objets

Chapitre 2. Classes et objets

Types d applications pour la persistance. Outils de développement. Base de données préexistante? 3 modèles. Variantes avec passerelles

Initiation à JAVA et à la programmation objet.

JAVA 8. JAVA 8 - Les fondamentaux du langage. Les fondamentaux du langage Java. Avec exercices pratiques et corrigés JAVA 8 29,90.

Traduction des Langages : Le Compilateur Micro Java

Java 7 Les fondamentaux du langage Java

basée sur le cours de Bertrand Legal, maître de conférences à l ENSEIRB Olivier Augereau Formation UML

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Auto-évaluation Programmation en Java

Programmer en JAVA. par Tama

INITIATION AU LANGAGE JAVA

UML. Diagrammes de classes (suite) Delphine Longuet.

Généralités. javadoc. Format des commentaires. Format des commentaires. Caractères spéciaux. Insérer du code

Service de réplication des données HP pour la gamme de disques Continuous Access P9000 XP

Présentation. Au programme. Fonctionnement. A l issue de ce module vous devriez...

Université de Bangui. Modélisons en UML

Facultés Universitaires Notre-Dame de la Paix. Conception et Programmation Orientées- Object

Tp 1 correction. Structures de données (IF2)

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Généralités sur le Langage Java et éléments syntaxiques.

Génie Logiciel avec Ada. 4 février 2013

Classe Interne, Anonyme & Enumération

Diagnostic adaptatif d'un flux d'alarmes par méta diagnostic distribué Application à la détection d'intrusions dans un serveur Web

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Alfresco Guide Utilisateur

Héritage presque multiple en Java (1/2)

LOGICIEL DE GESTION DE DOCUMENTS PDF : PROJET INFO 1

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

Environnements de développement (intégrés)

Mobyt Intégration HTTP TABLE DES MATIERES

Mobyt Intégration par Webservice TABLE DES MATIERES

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

OCL - Object Constraint Language

TP1 : Initiation à Java et Eclipse

Outils de traitements de logs Apache

Diagramme de classes

GESTION DES BONS DE COMMANDE

Tutoriel d'utilisation du logiciel Thunderbird version 2.0

2 Grad Info Soir Langage C++ Juin Projet BANQUE

Présentation générale de la méthode orientée objet : O.M.T. (Rumbaugh & al.)

1.3 Gestion d'une application

Application web de gestion de comptes en banques

Le modèle de données

Outils, langage et approche Android Une introduction. Nicolas Stouls lyon.fr

2 e édition JAVA 5 et 6. Jérôme Bougeault. TSoft et Groupe Eyrolles, 2003, 2008, ISBN :

TD/TP PAC - Programmation n 3

Langage Java. Classe de première SI

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Java Licence professionnelle CISII,

Classes et Objets en Ocaml.

Programme «Analyste Programmeur» Diplôme d état : «Développeur Informatique» Homologué au niveau III (Bac+2) (JO N 176 du 1 août 2003) (34 semaines)

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

PG208, Projet n 3 : Serveur HTTP évolué

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

GOL-502 Industrie de services. Travaux Pratique / Devoir #7

Cours de Génie Logiciel

PHP 5.4 Développez un site web dynamique et interactif

é n e r g i e c r é a t i v e Solution ing Renforcez le pouvoir de communication de votre entreprise

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

TP1. Outils Java Eléments de correction

Objets et Programmation. origine des langages orientés-objet

Projet de Veille Technologique

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Comment retrouver le fichier "bingo" sauvegardé dans l'ordinateur? Socle commun

Configuration d'un annuaire LDAP

LANGAGUE JAVA. Public Développeurs souhaitant étendre leur panel de langages de programmation

Projet gestion d'objets dupliqués

Manuel d utilisation NETexcom

Générer du code à partir d une description de haut niveau

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Cours de Java. Sciences-U Lyon. Java - Introduction Java - Fondamentaux Java Avancé.

Plan du cours. Historique du langage Nouveautés de Java 7

Gestion distribuée (par sockets) de banque en Java

I. Introduction aux fonctions : les fonctions standards

Introduction MOSS 2007

TD/TP PAC - Programmation n 3

EXA1415 : Annotations

Sommaire Introduction... 3 Le but du projet... 3 Les moyens utilisés... 3 Informations sur le client FTP... 4 Pourquoi une version Linux et

Architecture d'entreprise : Guide Pratique de l'architecture Logique

Utilisation d objets : String et ArrayList

Télécom Nancy Année

Transcription:

I N T E RFACE HOMME-MACHINE 1 I1 + T1 HEIA-FR J. BAPST 24.02.2015 S01 Classes, classes abstraites, enum et interfaces OBJECTIFS Mettre en œuvre les principes de base de la programmation orientée objet (encapsulation, héritage et polymorphisme). Définir et coder des classes, des sous-classes, des clases abstraites et des interfaces sur la base d'une spécification. Créer des objets et les utiliser. Exercer les nouvelles notions de programmation présentées au début du cours IHM-1 : énumérations, généricité, annotations et expressions lambda. Consulter et exploiter la documentation (API) de la plate-forme Java. Apprendre à connaître et utiliser des classes génériques du type Collection, notamment List<> et ArrayList<>. Découvrir et utiliser quelques classes de la plateforme Java et de JavaFX (Random, File, Point2D, Color). CONSIGNES Avec Eclipse, créer un projet nommé IHM1 qui sera utilisé pour toutes les séries d'exercices et les TP du cours. Sauf indications contraires, les classes, interfaces et autres éléments seront créés dans des packages dont le nom portera l'identification de la série (s01, s02, ). Des sous-packages pourront être créés, par exemple s01.test pour les classes de test, s01.tools pour des classes utilitaires, etc. D'une manière générale, respecter le principe d'encapsulation et soigner le codage (indentation, choix des identificateurs, conventions de codage, décomposition du code, commentaires appropriés, etc.). Respecter strictement les identificateurs proposés et les spécifications figurant dans les énoncés. Pour les méthodes, les paramètres et les valeurs de retour ne sont souvent pas indiqués; c'est à vous de les déterminer en fonction de l'énoncé. Bien lire et comprendre les énoncés avant de coder. Souvent les exercices s'enchaînent et il vaut la peine de lire l'ensemble des questions avant de débuter la conception et le codage. Prenez l'habitude de tester vos classes et vos méthodes au fur et à mesure de leur écriture (les méthodes de test peuvent même être écrites avant d'implémenter les classes à tester). Pensez à définir des scénarios de test qui ne comprennent pas que le cas général mais qui incluent également des cas particuliers. Dans le rapport qui sera rendu, indiquer clairement les tests effectués et les résultats obtenus (valeurs affichées sur la console, copies d'écran, etc.). Même si les exercices comportent plusieurs phases, seule la version finale du code sera rendue. Les commentaires et remarques devront cependant faire référence aux numéros des exercices de l'énoncé. Les exercices comportent parfois des questions explicitement mentionnées ( QUESTION ). Vos réponses, argumentées, doivent figurer dans le rapport rendu. Il faut profiter des séances de TP pour clarifier les éléments de la matière qui ne sont pas clairs (ne pas compter sur le rendu des TP). IHM1_S01.docx J. Bapst 1

EXERCICES 1 Définir et coder la classe abstraite Message ainsi que les classes concrètes Email, Sms et Mms selon le diagramme de classes suivant : Message Email Sms Mms La classe abstraite Message définira l'adresse de l'expéditeur du message (sender) ainsi que la liste des adresses des destinataires (recipients). Les adresses seront simplement enregistrées dans des chaînes de caractères (String). Pour la liste des destinataires on pourra utiliser un tableau ou, mieux, un objet de type List<String> (interface) en utilisant la classe concrète ArrayList<String>. Étudier préalablement l'api de ces classes qui se trouvent dans le package java.util. La classe Message comprendra une méthode abstraite display() dont le but sera d'afficher le contenu du message (défini dans les sous-classes). Des méthodes concrètes getsender() et getrecipients() permettront de connaître l'expéditeur et les destinataires du message. Dans la classe concrète Email le message sera enregistré sous forme d'une chaîne de caractères (String). Dans la classe concrète Sms le message sera enregistré sous forme d'un tableau caractères (avec de l'espace prévu pour 160 caractères). Dans la classe concrète Mms le message sera enregistré sous forme d'une chaîne de caractères et d'une image en couleur. L'image sera simplement définie et enregistrée comme un objet de type Image (javafx.scene.image.image). Il n'est pas indispensable de connaître les détails de cette classe. Remarque : pour pouvoir créer des objets de type Image en dehors d'une application JavaFX, il faut initialiser le contexte graphique en invoquant new JFXPanel(); au début de la méthode main(). Coder ces différentes classes : Message, Email, Sms, Mms. Dans chaque sous-classe, redéfinir la méthode tostring() (héritée de Object) pour qu'elle retourne une chaîne de caractères avec le contenu du message (par exemple "Serai en retard pour l'apéro, exercice IHM plus long que prévu"). L'implémentation de la méthode display() fera appel à tostring(). Pour la redéfinition des méthodes tostring() (héritée de Object) et display() (héritée de Message), utiliser l'annotation @Override qui permet au compilateur de vérifier que vous respectez bien les entêtes des méthodes telles qu'elles sont définies dans les classes parentes. Pensez à utiliser cette annotation chaque fois que vous redéfinissez des méthodes ou que vous implémentez les méthodes d'une interface. 2 Pour simuler un client de messagerie, créer une classe MailBox qui disposera des méthodes permettant d'envoyer des messages et de consulter le serveur de messagerie (simulé) pour voir si de nouveaux messages sont arrivés : send() receive() envoi d'un message réception du prochain message en attente sur le serveur (s'il y en a un) La méthode send() se contentera de simuler l'envoi en affichant le type de message, le nom de l'expéditeur, celui des destinataires et le contenu du message. Exemple : "SMS envoyé par Bob à Léa : Serai en retard pour l'apéro, exercice IHM plus long que prévu". IHM1_S01.docx J. Bapst 2

La méthode receive() simulera la consultation des différents serveurs de messagerie et se chargera, si un message a été reçu, de le récupérer. Elle simulera cette réception en retournant, au hasard, un message de type Email, Sms, Mms ou aucun message. On codera cette méthode de manière à ce que, dans 50% des cas, elle ne retourne aucun message, dans 30% des cas elle retourne un E-Mail et que les SMS et les MMS ne soient retournés que dans 10% des cas chacun. Indication : la classe Random permet de générer des nombres au hasard et peut être utile pour coder l'aspect aléatoire de la méthode receive(). 3 Écrire un programme permettant de tester votre classe MailBox. Imaginer un scénario de test permettant de tester l'ensemble des fonctionnalités. 4 Imaginer une autre forme de message, si possible assez différente des trois autres et coder cette nouvelle sous-classe de Message. Intégrer votre nouvelle classe dans la classe MailBox et adapter votre programme de test. QUESTION Quelles adaptations ont-elles été nécessaires dans la classe MailBox et dans le programme de test? 5 Créer une classe Rectangle qui modélise un rectangle dans un espace à deux dimensions et dont les côtés sont parallèles aux axes du système de coordonnées. Étudier l'api de la classe Point2D (javafx.geometry.point2d) et utiliser des objets de ce type pour implémenter la classe Rectangle. Définir (au moins) les constructeurs suivants : Rectangle(double x0, double y0, double x1, double y1); Rectangle(Point2D downleft, Point2D upright); La classe comprendra les méthodes suivantes (les valeurs de retour et les paramètres éventuels sont à déterminer) : getwidth() retourne la largeur du rectangle (sur l'axe x) getheight() retourne la hauteur du rectangle (sur l'axe y) isin() détermine si un point se trouve à l'intérieur du rectangle move() permet de déplace le rectangle d'une certaine distance (en x et en y) union() retourne le plus petit rectangle englobant deux rectangles (le rectangle représenté par l'objet courant et un autre rectangle passé en paramètre) intersection() Facultatif retourne le rectangle représenté par l'intersection de deux rectangles (zone de superposition) : le rectangle représenté par l'objet courant et un autre rectangle passé en paramètre. L'intersection peut être vide si les deux rectangles n'ont pas de zones communes. tostring() equals() redéfinir la méthode (héritée de Object) pour qu'elle retourne des informations pertinentes concernent l'état du rectangle (par exemple sous la forme "Rectangle [x0, y0], [x1, y1]"). Utiliser l'annotation @Override. redéfinir (@Override) la méthode (héritée de Object) pour qu'elle retourne true si les rectangles sont égaux (position et dimensions identiques). Écrire un programme de test pour valider le fonctionnement de la classe Rectangle (penser à tester aussi les situations particulières). y r1 x IHM1_S01.docx J. Bapst 3

6 Créer une classe Box qui spécialise la classe Rectangle et qui représente un rectangle que l'on peut afficher à l'écran. Ajouter pour cela les attributs suivants : l'épaisseur de la bordure (de type double) le type de ligne de la bordure (de type énuméré LineType) Créer le type énuméré LineType en tant qu'unité de compilation indépendante (hors de la classe) et définir les constantes PLAIN (continu), DASHED (traitillé) et DOTTED (pointillé). Dans la classe Box, définir les constructeurs nécessaires, ajouter les méthodes qui vous semblent utiles et redéfinir les méthodes tostring() et equals() héritées de la classe parente Rectangle. Compléter le programme de test précédemment écrit pour tester quelques objets de type Box. 7 Après avoir étudié l'api de la classe Color (javafx.scene.paint.color), créer une interface Colorable qui définit des méthodes permettant d'associer une couleur à un objet : paint() whatcolor() permet de définit la couleur de l'objet permet de connaître sa couleur (null si pas définie) L'interface Colorable comprendra également une méthode par défaut permettant d'inverser la couleur de l'objet (en associant la couleur complémentaire) : inversecolor() inverse la couleur actuellement définie (sans effet si aucune couleur n'est définie). Facultatif away() Ajouter à l'interface Colorable une méthode statique qui retourne la couleur possédant un contraste maximal avec une couleur donnée (celle qui est la plus éloignée d'elle dans l'espace colorimétrique RGB) : calcule la couleur la plus éloignée de la couleur passée en paramètre. 8 Adapter la classe Box pour qu'elle implémente l'interface Colorable. La couleur sera simplement enregistrée comme attribut de la classe. Compléter la méthode tostring() pour que les informations associées à la couleur du rectangle soient ajoutées à la chaîne de caractères retournée. 9 Adapter la classe Message pour qu'elle implémente aussi l'interface Colorable (un message coloré, n'est-ce pas sympathique?). Adapter les méthodes tostring() des quatre sous-classes de telle sorte que la méthode display() affiche, en complément, les informations associées à la couleur du message. 10 Créer, dans une nouvelle classe ColorTools, une méthode statique nommée paintall() permettant de colorier tous les objets contenus dans un tableau passé en paramètre avec une couleur déterminée (à passer également en paramètre). On aimerait notamment pouvoir colorier des objets de type Box, Email, Sms, Mms enregistrés dans le tableau passé en paramètre. QUESTION De quel type faut-il définir ce tableau? QUESTION Déclarer le tableau de type Object[] est certainement possible mais quelles en sont les implications? IHM1_S01.docx J. Bapst 4

11 Étudier la classe java.io.file et regarder comment on peut créer un objet de ce type connaissant le chemin d'accès à un fichier ou à un répertoire. Rechercher dans cette classe les méthodes permettant : de déterminer s'il s'agit d'un fichier ou d'un répertoire d'extraire le nom du fichier, avec et sans le chemin d'accès de déterminer la taille d'un fichier Expérimenter l'utilisation de cette classe en créant une classe TestFiles comprenant une méthode main() qui effectuera les opérations suivantes : Création de quelques objets de type File correspondant à des fichiers existants, non-existants et à des répertoires accessibles depuis votre machine. Test des méthodes permettant de déterminer si les fichiers existent, s'il s'agit de répertoires, de retrouver leur chemin d'accès complet, de déterminer leur taille (en bytes). 12 La classe File comprend une méthode list() qui permet de lister le contenu d'un répertoire. La méthode retourne un tableau de String contenant le nom des fichiers (ou sous-répertoires). Tester cette méthode en complétant la méthode main() de votre classe TestFiles. afin de lister le contenu d'un de vos répertoires. 13 Une surcharge de la méthode list(filenamefilter filter) prend en paramètre un filtre qui permet de ne lister que les fichiers qui passent le filtre. Le filtre est représenté par un objet qui doit implémenter l'interface fonctionnelle FilenameFilter. L'unique méthode abstraite de cette interface possède la signature suivante : boolean accept(file dir, String name) Si cette méthode retourne true pour le fichier dont le nom est name, il sera accepté et sera ajouté dans la liste retournée par la méthode list(), sinon, il sera ignoré. Pour créer le filtre, on doit donc implémenter une interface fonctionnelle, ce qui peut se faire de différentes manières : Par une classe 'ordinaire' qui implémente FilenameFilter, puis création d'une instance Par une classe anonyme Par une expression lambda Tester le fonctionnement de la méthode list() en ajoutant dans votre classe TestFiles l'affichage de différentes listes filtrées : Liste de tous les fichiers images (fichiers avec l'extension.jpg,.jpeg,.gif ou.png) Le filtre sera créé sous la forme d'une classe anonyme. Même filtre mais créé sous la forme d'une expression lambda. Facultatif Même filtre mais créé sous la forme d'une classe 'ordinaire'. QUESTION A votre avis, quelle est la meilleure variante? Pourquoi (avantages/inconvénients)? IHM1_S01.docx J. Bapst 5