/**
 * Piece.java
 * une pièce quelconque.
 * Pourra modéliser une pièce simple.
 */
public class Piece  {
  private String nom;
  private int temps;
  public Piece(String nom, int temps) {
    this.nom = nom;
    this.temps = temps;
  }
  /**
   * Retourne le temps marginal pour fabriquer la pièce
   */
  public int getTemps() {
    return temps;
  }
  /**
   * Retourne le temps total pour fabriquer la pièce
   * (y compris le temps pour fabriquer les éventuelles
   * pièces utilisées pour fabriquer cette pièce)
   */
  public int getTempsTotal() {
    return temps;
  }
} // Piece


import java.util.*;
/**
 * PieceComplexe.java
 * composée d'au moins 1 autre pièce
 */
public class PieceComplexe extends Piece {
  private ArrayList composants;
  public PieceComplexe(String nom, int temps) {
    super(nom, temps);
    composants = new ArrayList();
  }
  public void add(Piece piece) {
    composants.add(piece);
  }
  /**
   * Retourne le temps total pour fabriquer la pièce
   * (y compris le temps pour fabriquer les éventuelles
   * pièces utilisées pour fabriquer cette pièce)
   */
  public int getTempsTotal() {
    int total = getTemps();
    for (int i = 0; i < composants.size(); i++) {
      total += ((Piece)composants.get(i)).getTempsTotal();
    }
    return total;
  }
 

 

  public static void main(String[] args) {
    // Pièce simple de nom p1 ; il faut 10 mn pour la fabriquer
    Piece p1 = new Piece("p1", 10);
    Piece p2 = new Piece("p2", 15);
    // Pièce complexe ; il faut 12 mn pour assembler les composants
    PieceComplexe p3 = new PieceComplexe("p3", 5);
    p3.add(p1);
    p3.add(p2);
    System.out.println(p3.getTempsTotal()); // polymorphisme
    PieceComplexe p4 = new PieceComplexe("p4", 25);
    p4.add(p1);
    p4.add(p3);
    System.out.println(p4.getTempsTotal());
  }
 

Utilisation du polymorphisme :

pour getTempsTotal(), dans le calcul de total, on envoie le message getTempsTotal() à une pièce qui peut être une Piece ou une PieceComplexe.