abstract class Animal {
  abstract void crier();
}

class Chien extends Animal {
  private String nom;
  Chien(String nom) {
    this.nom = nom;
  }
  void aboyer() {
    System.out.println(nom + " aboie.");
  }
  void crier() { aboyer(); }
}
class Chat extends Animal {
  private String nom;
  Chat(String nom) {
    this.nom = nom;
  }
  void miauler() {
    System.out.println(nom + " miaule.");
  }
  void crier() { miauler(); }
}
class Cheval extends Animal {
  private String nom;
  Cheval(String nom) {
    this.nom = nom;
  }
  void hennir() {
    System.out.println(nom + " hennit.");
  }
  void crier() { hennir(); }
}
class Animaux {
  public static void main(String[] args) {
    Animal c = new Chien("Snoopy");
    ((Chien) c).aboyer();
    Animal d = new Chat("Minou");
    ((Chat) d).miauler();
    Animal[] animaux = new Animal[3];
    animaux[0] = c;
    animaux[1] = d;
    animaux[2] = new Cheval("Etalon noir");
    for (int i = 0; i < animaux.length; i++) {
      Animal a = animaux[i];
      if (a instanceof Chien)
	((Chien) a).aboyer();
      else if (a instanceof Chat)
	((Chat) a).miauler();
      else
	((Cheval) a).hennir();
    }
    for (int i = 0; i < animaux.length; i++) 
      animaux[i].crier();
  }

}

