Este es otro ejercicio para el curso de Coursera. Lo más interesante es el uso de super para llamar métodos over-rideados en sub-clases y una abstract class. Si te parás a pensarlo, el uso de Dynamic Dispatch es bastante complicado.

Por ejemplo, cuando definimos el método afficher() en la super clase Item, este se fija si el courrier es válido.


// PROGRAMME PRINCIPAL (A NE PAS MODIFIER)
class Poste {

 public static void  main(String args[]) {
  //Cr'eation d'une boite-aux-lettres
  // 30  est la capacit'e maximale de la
  // boite aux lettres
  // (pas necessaire si vous dêcidez d'utiliser
  // un ArrayList).
  Boite boite = new Boite();

  //Creation de divers courriers/colis..
  Lettre lettre1 = new Lettre(200, true, 
                             "Chemin des Acacias 28, 1009 Pully", "A3");
  Lettre lettre2 = new Lettre(800, false, "", "A4"); // invalide
  
  Publicite pub1 = new Publicite(1500, true, 
                                  "Les Moilles  13A, 1913 Saillon");
  Publicite pub2 = new Publicite(3000, false, ""); // invalide

  Colis colis1 = new Colis(5000, true, "Grand rue 18, 1950 Sion", 30);
  Colis colis2 = new Colis(3000, true, 
                           "Chemin des fleurs 48, 2800 Delemont", 70); 
  boite.ajouterCourrier(lettre1);
  boite.ajouterCourrier(lettre2);
  boite.ajouterCourrier(pub1);
  boite.ajouterCourrier(pub2);
  boite.ajouterCourrier(colis1);
  boite.ajouterCourrier(colis2);
  boite.afficher();

  /*
  System.out.println("Le montant total d'affranchissement est de " +
         boite.affranchir());
  boite.afficher();
  
  System.out.println("La boite contient " + boite.courriersInvalides()
         + " courriers invalides");
 */
 }
}


class Boite {
  Item[] items = new Item[30];
  int head = 0;
  
  public void ajouterCourrier(Item item) {
     items[head] = item;
     head++;
  }
  
  public void afficher() {
    for (int i = 0; i<head; i++) {
     items[i].afficher();
     System.out.println("\n");
    }    
  }
}

abstract class Item {
  
    int poids;
    boolean express;
    String address;
    
  Item(int poids, boolean express, String address) {
    
   this.poids = poids;
   this.express = express;
   this.address = address;
  }
  
  public double getMontant() {
    return 0.0;
  }
   public void afficher() {
     
     if (!isValid()) {
   System.out.println("(Courrier  invalide)");
     }
   System.out.println("Poids :  " + poids + " grammes");
   if (express) { System.out.println("Express :  oui"); }
   else System.out.println("Express :  non");
   System.out.println("Destination :  " + address);
   System.out.println("Prix : " + affranchir() + " CHF");
  }
   
   public boolean isValid() {
       return !address.equals("");
   }
   
   abstract double affranchir();
}



class Colis extends Item {
  int volumen;
  
  Colis(int poids, boolean express, String address, int volumen) {
   super(poids, express, address);
   this.volumen = volumen;
  }
  
  public void afficher() {
   System.out.println("Colis");
   super.afficher();
   
  }
  
  public double affranchir() {
   // montant = 0.25 * volume (litres) + poids (kilos) * 1.0; 
   if (isValid()) return 0.25 * volumen  + poids * 1.0; 
   else return 0.0;
  }
  
  public boolean isValid() {
   return super.isValid() && volumen <=50; 
  }
}

class Publicite extends Item {
    
  Publicite(int poids, boolean express, String address) {
    super(poids, express, address);
  }
   public void afficher() {
   System.out.println("Publicité");
   super.afficher();

  }
   
   public double affranchir() {
    double result = 5.0 * poids/1000;
    if (express)  result *= 2.0;
    
    if(isValid()) return result;
    else          return 0.0;
   }
  
}

class Lettre extends Item {
  
  String format;
  
  Lettre(int poids, boolean express, String address, String format) {  
   super(poids, express, address);
   this.format = format;
  }
   public void afficher() {
   System.out.println("Lettre");
   super.afficher();
   System.out.println("Format : " + format);
  }
   
   public double affranchir() {
    // tarif de base + 1.0 * poids (kilos), 
    // où le tarif de base pour une lettre "A4" est de 2.50, et 3.50 pour une lettre "A3" 
     
   double base;
   if (format == "A4") base = 2.5;
   else                base = 3.5;
 
   double result = base + 1.0 * (poids / 1000.0);
   if (express) result *= 2.0;
   if(isValid()) return result;
   else          return 0.0;
   }
}

Esto de aprender java tiene momentos dolorosos!!!!

Anuncios