package plp.gestion; import plp.collection.VecteurInfini; abstract class DeviseAbstraite implements Devise { private static final VecteurInfini DEVISES = new VecteurInfini(); private final String nom; private double tauxDeChangeEnEuro; static { String [] nomsDevises = {"Franc", "Mark", "Pesetas", "Escudo", "Lire", "Euro"}; double [] tauxChange = {6.55957, 1.95583, 166.386, 200.482, 1936.270, 1.}; for (int i = 0; i < nomsDevises.length; ++i) { try { new DeviseTauxFixe(nomsDevises[i], tauxChange[i]); } catch (Exception e) { throw new Error(e.getMessage()); } } } /** * Cree une devise avec un premier taux de change en Euro. Il est * impossible de creer deux devises ayant le même nom. */ DeviseAbstraite (String nom, double tauxDeChangeEnEuro) throws DeviseExistanteException { try { Devise d = devise(nom); throw new DeviseExistanteException(d); } catch (DeviseInconnueException e) { this.nom = nom; this.tauxDeChangeEnEuro = tauxDeChangeEnEuro; DEVISES.inserer(this); } } public String nom() { return this.nom; } public double tauxDeChangeEnEuro() { return this.tauxDeChangeEnEuro; } void changerTauxDeChangeEnEuro(double nouveauTaux) { tauxDeChangeEnEuro = nouveauTaux; } public double conversionEnEuro(double somme) { return somme / tauxDeChangeEnEuro; } public double conversion(Devise deviseCible, double somme) { return somme / tauxDeChangeEnEuro * deviseCible.tauxDeChangeEnEuro(); } public String toString() { return "Devise " + nom + " (taux de change en Euro = " + tauxDeChangeEnEuro + ")"; } public static Devise devise(String nom) throws DeviseInconnueException { for (int i = 0; i < DEVISES.cardinal(); i++) { Devise d = (Devise)DEVISES.element(i); if (d.nom().equals(nom)) { return d; } } throw new DeviseInconnueException(nom); } public static boolean existeDevise (String nom) { try { devise(nom); return true; } catch (DeviseInconnueException e) { return false; } } public static Devise [] devisesTraitees () { int n = DEVISES.cardinal(); Devise [] copieDevises = new Devise[n]; for (int i = 0; i < n; ++i) { copieDevises[i] = (Devise)DEVISES.element(i); } return copieDevises; } }