// MODULE: ForTwo.java // AUTEUR: felipe // OBJET: Exemple du cours sur l'heritage // COMMENT: plusieurs hierarchies de classes dans ce programme class Point { protected int x,y; public Point(int x,int y) { this.x = x; this.y = y; } public int getX() {return x;} public int getY() {return y;} public String toString() { return "Point (" + x + "," + y + ")"; } } // ------------------------------------------ // une version heritage // ------------------------------------------ class CercleHeritage extends Point { private int rayon; // constructeur coordonnees du centre puis rayon public CercleHeritage (int x,int y, int r) { super(x,y); rayon = r; } public String toString() { return "Cercle centre: "+ super.toString() + " rayon= " + rayon; } } // ------------------------------------------ // une version composition // ------------------------------------------ class CercleComposition { private Point centre; private int rayon; public CercleComposition (int x, int y, int r) { centre = new Point(x,y); rayon = r; } public String toString() { return "Cercle centre: (" + centre.getX() + "," + centre.getY() + ") rayon= " + rayon; } } // ------------------------------------------ // Autre hierachie de classes // ------------------------------------------ class Animaux { public String modeDeplacement() { return "est un animal qui se deplace !!!"; } public String toString() {return "Un animal";} } class AnimauxQuiNagent extends Animaux { protected int nbNageoires; public String modeDeplacement() {return "est un animal qui nage";} public AnimauxQuiNagent(int nb) {nbNageoires = nb;} public String toString() {return "Un animal qui nagent avec " + nbNageoires + " nageoires";} } class AnimauxQuiVolent extends Animaux { protected boolean aDesPlumes; public String modeDeplacement() {return "est un animal qui vole";} public AnimauxQuiVolent(boolean plume) {aDesPlumes = plume;} public String toString() { return "Un animal qui vole " + ((aDesPlumes)? " avec des plumes" : "sans plume"); } } class AnimauxQuiMarchentOuSautent extends Animaux { protected int nbPattes; public String modeDeplacement() {return "est un animal qui marche ou qui saute";} public AnimauxQuiMarchentOuSautent(int nb) {nbPattes = nb;} public String toString() {return "Un animal qui marche ou qui saute avec " + nbPattes + " pattes";} } final class Grenouille extends AnimauxQuiMarchentOuSautent { private String couleur; public Grenouille (String color) { super(4); couleur = color; } public String toString() { return "Une grenouille " + couleur + " qui a " + nbPattes + " pattes"; } } final class Baleine extends AnimauxQuiNagent { String couleur; public Baleine (String color) { super(3); couleur = color; } public String toString() { return "Une baleine " + couleur + " qui a " + nbNageoires + " nageoires"; } } final class Pelikan extends AnimauxQuiVolent { public Pelikan (boolean plume) {super(plume);} public String toString() { return "Un pelikan: " + super.toString(); } } // ------------------------------------------ // comment ferait-on sans heritage et polymorphisme ? // ------------------------------------------ class Animal { private static final int VOLE = 1; private static final int NAGE = 2; private static final int MARCHE = 3; private int nbPattes; // si l'animal a des pattes private int nbNageoires; // si l'animal a des nageoires private boolean plumes; // si l'animal a des plumes private int typeObjet; // un constructeur pour les animaux qui volent public Animal (boolean plume) { typeObjet = VOLE; plumes = plume; } // un constructeur pour les animaux qui marchent public Animal (int nb, int paramFactice) { typeObjet = MARCHE; nbPattes = nb; } // un constructeur pour les animaux qui nagent public Animal (int nb) { typeObjet = MARCHE; nbNageoires = nb; } // voici a quoi ressemblerait la methode modeDeplacement public String modeDeplacement() { switch (typeObjet) { case VOLE: if (plumes) return "animal avec des plumes qui vole"; return "animal sans plume qui vole"; case NAGE: return "animal qui nage et qui a " + nbNageoires + " nageoires"; case MARCHE: return "animal qui marche et qui a " + nbPattes + " pattes"; default: return "animal inconnu"; } } } // ------------------------------------------ // la classe public // ------------------------------------------ public class ForTwo { public static void main (String args []) { // -- heritage vs composition ? CercleHeritage c; CercleComposition d; c = new CercleHeritage(4,4,10); System.out.println(c); // appel implicite a toString d = new CercleComposition(4,4,10); System.out.println(d); // appel implicite a toString // -- tout sur les zanimos Grenouille pepita = new Grenouille ("verte"); Baleine bb = new Baleine ("bleue"); System.out.println(pepita + " " + pepita.modeDeplacement()); System.out.println(bb+ " " + bb.modeDeplacement()); // --- une baleine est un animal Animaux animal; // juste une reference Grenouille g; // juste une reference animal = bb; System.out.println("animal: " + animal+ " " + animal.modeDeplacement()); animal = pepita; System.out.println("animal: " + animal+ " " + animal.modeDeplacement()); // un animal est une grenouille ? // ne marche pas: g = animal; g = (Grenouille) animal; System.out.println(g+ " " + g.modeDeplacement()); // mais on peut ecrire des choses qui compilent... // mais qui ne marchent pas... animal = bb; // ne faites pas trop attention au block try/catch // il dit simplement essaye de faire les operations dans le // bloc try, si tu n'y arrives pas execute le bloc catch adequat // nous verrons cela plus tard en cours... try { g = (Grenouille) animal; System.out.println(g+ " " + g.modeDeplacement()); } catch (ClassCastException e) { System.out.println("Une Baleine n'est pas une grenouille ..."); } // apres cette decouverte (non egalite des races animales) // voyons un exemple de polymorphisme a plus grande echelle Animaux faune [] = { new Grenouille("verte"), new Grenouille("marron"), bb, new Baleine("blanche"), new Pelikan(true) }; for (int i=0; i