Corrigé indicatif : avec Héritage
La classe Personne
Le fichier
Personne.java . Clic droit avec la souris pour récupérer le fichier. Attention : Le fichier doit être renommé avec une initiale en majuscule avant de l'enregistrer sur votre disque.
Remarques
- Initialisation des attributs avec des valeurs par défaut ou création d'objets.
- this() pour appeler le constructeur non paramétré de cette classe.
- le code du constructeur non paramétré n'est pas très lisible : il pourrait être bien de le déplacer dans une classe utilitaire nommée SequencePersonne.
Ajout d'un attribut numId non demandé dans le sujet
Pour vous montrer :
- comment gérer un fichier Properties
- Gestion des exceptions
- IOException et try{} catch{}
Contenu du fichier sequenceIdPersonne.properties :
#Sat May 12 12:26:16 CEST 2012 numId=41
Le code Java
package tp4.avecheritage; import java.util.Properties; import java.io.FileOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.File; import java.util.logging.Level; import java.util.logging.Logger; import tp4.commun.Adresse; /** * La classe Personne décrit un objet qui a un nom, une adresse, un numéro de * téléphone et une adresse de courriel. Il y a une légère modification par * rapport au sujet. Une personne a, aussi, un identifiant. * * @author BA * @version 1.0 */ public abstract class Personne { /** * Constructeur pour des objets de classe Personne. Initialise l'objet avec * des valeurs par défaut. */ public Personne() { // initialise les variables d'instance avec des valeurs par défaut. nom = null; Properties prop = new Properties(); File f = new File("G:/fichiersDeDonness/sequenceIdPersonne.properties"); if ( ! f.exists() ){ try{ prop.setProperty("numId", "0"); prop.store(new FileOutputStream("G:/fichiersDeDonness/sequenceIdPersonne.properties"), null); } catch (IOException ex) { Logger.getLogger(Personne.class.getName()).log(Level.SEVERE, null, ex); } } else{ System.out.println("url else != null"); } try { prop.load(new FileInputStream("G:/fichiersDeDonness/sequenceIdPersonne.properties")); String numCh=prop.getProperty("numId"); numId = Integer.valueOf(numCh)+1; prop.setProperty("numId",String.valueOf(numId)); prop.store(new FileOutputStream("G:/fichiersDeDonness/sequenceIdPersonne.properties"), null); } catch (IOException pExcptn) { pExcptn.printStackTrace(); } } /** * Constructeur paramétré pour les objets de classe Personne. */ public Personne(String pNom) { // initialise les variables d'instance (attributs) avec les valeurs des paramètres reçus. this(); // Exécution du constructeur non paramétré nom = pNom; System.out.println("Personne + nom"); } /** * Constructeur paramétré pour les objets de classe Personne. */ public Personne(String pNom, Adresse pAdrs) { // initialise les variables d'instance (attributs) avec les valeurs des paramètres reçus. this(); // Exécution du constructeur non paramétré nom = pNom; adresse = pAdrs; System.out.println("Personne + nom+ adresse"); } public final String getNom() { return nom; } public void setNom(String value) { nom = value; } public final String getNumTel() { return numTel; } public void setNumTel(String value) { numTel = value; } public final Adresse getAdresse() { return adresse; } public void setAdresse(Adresse value) { adresse = value; } public final String getAdresseCourriel() { return adresseCourriel; } public void setAdresseCourriel(String value) { adresseCourriel = value; } public int getNumId() { return numId; } /** * Cette méthode renvoie une chaîne de caractères. Cette méthode est * abstraite car ce qui est renvoyé dépend de l'objet (la classe) dont on * doit afficher les informations essentielles. Le format des données * renvoyées déepnd de la classe. Le contenu de cette méthode devra être * re-défini dans les classes héritières de la classe Personne. */ public abstract String chaineAffichageEnModeTexte(); /** * variables d'instance */ private int numId; private String nom; private String numTel; private Adresse adresse; private String adresseCourriel; }