UE 2I002 (ex LI230) : éléments de programmation par objets avec Java!! TD7 - Héritage et classe abstraite Juliana Silva Bernardes juliana.silva_bernardes@upmc.fr
Sumary Héritage Classes et méthodes abstracts Redéfinition de méthodes existantes 2
Héritage Organize les classes de manière hiérarchique. 3
public class Instrument{! protected double poids; protected double prix; public Instrument(double poids, double prix){ this.poids = poids; this.prix = prix; //@Override vous oblige de redefinir correctement la method tostring @Override public String tostring() { return "Instrument [poids="+ poids + ", prix=" + prix +"]"; 4
public class Guitare extends Instrument{ public Guitare(double poids, double prix){ super (poids, prix); public void jouer() { System.out.println("La guitare joue!"); public class Trompette extends Instrument{ public Trompette(double poids, double pri super (poids, prix); public void jouer() { System.out.println("La Trompette joue!" public class Piano extends Instrument{ public Piano(double poids, double prix){ super (poids, prix); public void jouer() { System.out.println("Le Piano joue!"); 5
Héritage public class Orchestre{ private int nmax; private Instrument [] tabinst; private int numins; public Orchestre(int nmax){ this.nmax = nmax; numins = 0; tabinst = new Instrument[nmax]; public void ajouterinstrument(instrument i) { tabinst[numins] = i; numins++; public void jouer() { for (int i = 0; i< numins; i++){ tabinst[i].jouer(); 6 Quel est le problème dans le code actuel? Pas de méthode jouer dans la classe mère instrument.
Classes et méthodes abstracts public class Instrument{ protected double poids; protected double prix;! public Instrument(double poids, double prix){ this.poids = poids; this.prix = prix; @Override public String tostring() { return "Instrument [poids="+ poids + ", prix=" + prix +"]"; public void jouer() { Une solution plus jolie sont les methodes abstract 7
Classes et méthodes abstracts public abstract class Instrument{ protected double poids; protected double prix;! public Instrument(double poids, double prix){ this.poids = poids; this.prix = prix; @Override public String tostring() { return "Instrument [poids="+ poids + ", prix=" + prix +"]"; public abstract void jouer(); 8
Classes et méthodes abstracts Les méthodes abstract Seulement dans les classes abstracts Contient une signature mais pas de code public abstract void jouer(){ public abstract void jouer(); Les classes abstract Ne peut pas être instancié Permet de factoriser du code pour toutes les classes qui hériteront Notion de contrat : toutes les classes filles devront gérer ce qui est décidé par la classe mère (signature de méthode abstraite) 9
Classes et méthodes abstracts Les classes doivent soit être déclarée abstraite, soit définir le corps de méthodes abstracts : surface() et affiche(). 10
Redéfinition de méthodes existantes public abstract class A{ protected int x; public A (int x){ this.x =x; public abstract void ma(); public class B extends A{ public B (int x){ super(x); public void mb(){ La classe B doit redefinir la method ma ou être declarer come abstract public class B extends A{ public B (int x){ super(x); public void mb(){ public void ma(){ ou public abstract class B extends A{ public B (int x){ super(x); public void mb(){ 11