RAPPELS SUR L HERITAGE EN PROGRAMMATION ORIENTEE-OBJET ET EN JAVA Fabien MOUTARDE Centre de Robotique (CAOR) Fabien.Moutarde@mines-paristech.fr Rappels sur l héritage en programmation orientée-objet et en Java, Fabien MOUTARDE, CAOR Mines ParisTech sept. 2011 1 HIERARCHIE DE CLASSES Animaux Animal Oiseaux Mammifères Chats Chiens Oiseau Mammifère Chat Chien Rappels sur l héritage en programmation orientée-objet et en Java, Fabien MOUTARDE, CAOR Mines ParisTech sept. 2011 2
HERITAGE EN JAVA public void vieillir(){ age++; Oiseau hérite de Animal ==> un Oiseau est un cas particulier d Animal, et tout oiseau hérite d un attribut age et d une méthode vieillir() Rappels sur l héritage en programmation orientée-objet et en Java, Fabien MOUTARDE, CAOR Mines ParisTech sept. 2011 3 AJOUT DE METHODES OU D ATTRIBUTS DANS UNE CLASSE FILLE // AJOUT DE METHODE public void couver() { class Mammifere extends Animal { // AJOUT D ATTRIBUT private boolean engestation; Rappels sur l héritage en programmation orientée-objet et en Java, Fabien MOUTARDE, CAOR Mines ParisTech sept. 2011 4
HERITAGE ET SPECIALISATION DE METHODES PAR UNE CLASSE «FILLE» public void vieillir(){ age++; System.out.println("!"); // SPECIALISATION DE METHODE System.out.println("Cui-cui!"); Oiseau titi = new Oiseau(); // APPEL DE METHODE HERITEE titi.vieillir(); // APPEL DE METHODE SPECIALISEE // (i.e. REDEFINIE) titi.crier(); Rappels sur l héritage en programmation orientée-objet et en Java, Fabien MOUTARDE, CAOR Mines ParisTech sept. 2011 5 HERITAGE ET VISIBILITE EN JAVA protected double poids; public void vieillir(){ age++; private void m() { public void grossir() { int a = age; poids *= 1/(1+a); ERREUR : age est privé OK : poids est «protégé» m(); ERREUR : m() est privée ==> ATTENTION aux visibilités («protections») des attributs et méthodes de la classe mère Rappels sur l héritage en programmation orientée-objet et en Java, Fabien MOUTARDE, CAOR Mines ParisTech sept. 2011 6
HERITAGE ET REFERENCES EN JAVA Une référence vers une instance de la classe Fille peut être utilisée partout où une référence de type Mère est attendue : class Animalerie { public void ajouter( Animal a ){ Animalerie boutique = new Animalerie(); la méthode ajouter() attend un Animal en paramètre elle accepte un Oiseau boutique.ajouter( new Oiseau() ); Animal bete = new Oiseau(); une référence à Animal peut pointer vers un Oiseau Rappels sur l héritage en programmation orientée-objet et en Java, Fabien MOUTARDE, CAOR Mines ParisTech sept. 2011 7 «POLYMORPHISME» DYNAMIQUE System.out.println("!"); // REDEFINITION DE METHODE System.out.println("Cui-cui!"); class Chat extends Mammifere { // REDEFINITION DE METHODE System.out.println("Miaou!"); Animal bete; bete = new Chat(); bete.crier(); appelle Animal [] tab; tab = new Animal[2]; tab[0] = new Oiseau(); tab[1] = new Chat(); for (int i=0; i<tab.length; i++) tab[i].crier(); appelle la version de crier() correspondant au type de l objet vers lequel pointe tab[i] (et non au type de tab) Rappels sur l héritage en programmation orientée-objet et en Java, Fabien MOUTARDE, CAOR Mines ParisTech sept. 2011 8
HERITAGE ET CONSTRUCTEURS EN JAVA Appel du constructeur de la classe mère public Animal(int ageadoption){ age = ageadoption; private boolean sachantchanter; public Oiseau(int ageadoption, boolean chanteur){ super(ageadoption); sachantchanter = chanteur; Rappels sur l héritage en programmation orientée-objet et en Java, Fabien MOUTARDE, CAOR Mines ParisTech sept. 2011 9 RE-UTILISATION D UNE METHODE DE CLASSE MERE QUI A ETE REDEFINIE DANS LA CLASSE FILLE Appels d une méthode de la classe mère qui a été redéfinie dans la classe fille System.out.println("!"); class Chat extends Mammifere { // REDEFINITION DE METHODE System.out.print("Miaou"); super.crier(); public void m() { super.crier(); Rappels sur l héritage en programmation orientée-objet et en Java, Fabien MOUTARDE, CAOR Mines ParisTech sept. 2011 10
OPERATEUR instanceof Permet de tester le type EFFECTIF de l objet pointé par une référence Exemple : class Mere {/* */ class Fille extends Mere {/* */ Mere m = new Fille(); boolean b = m instanceof Fille; ATTENTION : en fait cela vérifie juste si la référence pointe vers un objet de la classe ou d une de ses sous-classes ci-dessus, m instanceof Mere est AUSSI vrai (et m instanceof Object est TOUJOURS vrai) Rappels sur l héritage en programmation orientée-objet et en Java, Fabien MOUTARDE, CAOR Mines ParisTech sept. 2011 11 METHODES ET CLASSES ABSTRAITES abstract // DECLARATION DE METHODE ABSTRAITE abstract public void manger(); abstract // METHODE ABSTRAITE HERITEE // NON-REDEFINIE ==> RESTE ABSTRAITE class Poule extends Oiseau { // IMPLEMENTATION DE LA METHODE public void manger() { System.out.println("Picorer"); class Poisson extends Animal { // AUTRE IMPLEMENTATION DE LA METHODE public void manger() { System.out.println("Gober"); La méthode abstraite ne sert que de déclaration, à redéfinir dans les classes filles concrètes Animal bete = new Animal(); Une classe abstraite ne peut PAS être instanciée, et ne sert que de classe mère, et de type pour références (mais peut avoir des constructeurs!) Animal [] tab; tab = new Animal[2]; tab[0] = new Poule(); tab[1] = new Poisson(); for (int i=0; i<tab.length; i++) tab[i].manger(); Rappels sur l héritage en programmation orientée-objet et en Java, Fabien MOUTARDE, CAOR Mines ParisTech sept. 2011 12