UE 2I002 (ex LI230) : éléments de programmation par objets avec Java
TD7 - Héritage et classe abstraite
! !
Juliana Silva Bernardes
[email protected]
‣Héritage
‣Classes et méthodes abstracts
‣Redéfinition de méthodes existantes
Sumary
Héritage
‣ Organize les classes de manière hiérarchique.
page 102 6. H´eritage et mod´elisation
1 public c l a s s T e s t P e r s o n n e {
2 public s t a t i c void main ( S t r i n g [ ] a r g s ) {
3 Personne p = new Personne (" Albert ") ;
4 p . a j o u t e r E n f a n t ( ) ; p . a j o u t e r E n f a n t ( ) ;
5 double primP=p . prime ( ) ;
6 System . out . p r i n t l n ( p . getNom ( ) + p . g e t S a l a i r e ( ) ) ;
7 E t u d i a n t e = new E t u d i a n t (" Ahmed " ," L2 ") ;
8 e . a j o u t e r E n f a n t ( ) ;
9 double primE=e . prime ( ) ;
10 System . out . p r i n t l n ( e . getNom ( ) ) ;
11 boolean enL2 = e . estEnL2 ( ) ;
12 S a l a r i e s = new S a l a r i e (" Pauline ") ;
13 System . out . p r i n t l n ( s . getNom ( ) ) ;
14 }
15 }
– Erreur sur prime de Personne (ligne 5) et de Etudiant (ligne 9).
– Erreur sur getSalaire (ligne 6)
– Erreur sur cr´eation Pauline (ligne 12), Ahmed (ligne 7)
Exercice 49 – Orchestre
Exercice de base sur l’h´eritage pour introduire l’utilit´e des classes abstraites et de la red´efinition de m´ethodes.
On souhaite mod´eliser le d´eroulement d’un orchestre. Un orchestre est compos´e d’un ensemble d’instruments.
On instanciera des guitares, pianos, trompettes.
Q 49.1
Dessiner l’arbre d’h´eritage du probl`eme.
Instrument --- Piano --- Guitare --- Trompette
Ne pas h´esiter `a donner la version UML light (boite avec le nom des classes + fl`eche d’h´eritage tˆete triangle
vide.
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 +"]";
}
}
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 Piano extends Instrument{
public Piano(double poids, double prix){
super (poids , prix);
}
public void jouer() {
System.out.println("Le Piano joue!");
} }
public class Trompette extends Instrument{
public Trompette(double poids, double prix){
super (poids , prix);
}
public void jouer() {
System.out.println("La Trompette joue!");
} }
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++){
Héritage
Quel est le problème dans le code actuel?
Pas de méthode jouer dans la classe mère instrument.
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
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();
}
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)
Classes et méthodes abstracts
10
Classes et méthodes abstracts
$IBQJUSF )ÏSJUBHF
$FUUF TUSVDUVSF EF DMBTTFT OPVT QFSNFU EÏTPSNBJT EF QPVWPJS DPNQJMFS MFYFNQMF EPOOÏ EBOT MB TFDUJPOŠŝŞ USBJUBOU EV QPMZNPSQIJTNF &O EÏDMBSBOU VO UBCMFBV DPOTUJUVÏ EPCKFUT JNQMÏNFOUBOU MJOUFSGBDF PO QFVU BQQFMFS MB NÏUIPEF RVJ FYJTUF FU FTU JNQMÏNFOUÏF QBS DIBRVF PCKFU
4J VOF DMBTTF JNQMÏNFOUF VOF JOUFSGBDF NBJT RVF MF QSPHSBNNFVS OB QBT ÏDSJU MJNQMÏNFOUB UJPO EF UPVUFT MFT NÏUIPEFT EF MJOUFSGBDF VOF FSSFVS EF DPNQJMBUJPO TF QSPEVJSB TBVG TJ MB DMBTTF FTU VOF DMBTTF BCTUSBJUF
$MBTTFT BCTUSBJUFT
-F DPODFQU EF DMBTTF BCTUSBJUF TF TJUVF FOUSF DFMVJ EF DMBTTF FU DFMVJ EJOUFSGBDF $FTU VOF DMBTTF RVPO OF QFVU QBT EJSFDUFNFOU JOTUBODJFS DBS DFSUBJOFT EF TFT NÏUIPEFT OF TPOU QBT JNQMÏNFO UÏFT 6OF DMBTTF BCTUSBJUF QFVU EPOD DPOUFOJS EFT WBSJBCMFT EFT NÏUIPEFT JNQMÏNFOUÏFT FU EFT TJHOBUVSFT EF NÏUIPEF Ë JNQMÏNFOUFS 6OF DMBTTF BCTUSBJUF QFVU JNQMÏNFOUFS QBSUJFMMFNFOU PV UPUBMFNFOU EFT JOUFSGBDFT FU QFVU IÏSJUFS EVOF DMBTTF PV EVOF DMBTTF BCTUSBJUF
-F NPUDMÏ FTU VUJMJTÏ EFWBOU MF NPUDMÏ QPVS EÏDMBSFS VOF DMBTTF BCTUSBJUF BJOTJ RVF QPVS MB EÏDMBSBUJPO EF TJHOBUVSFT EF NÏUIPEFT Ë JNQMÏNFOUFS
*NBHJOPOT RVF MPO TPVIBJUF BUUSJCVFS EFVY WBSJBCMFT FU Ë UPVU PCKFU SFQSÏTFOUBOU VOF GPSNF $PNNF VOF JOUFSGBDF OF QFVU DPOUFOJS EF WBSJBCMFT JM GBVU USBOTGPSNFS
FO DMBTTF BCTUSBJUF DPNNF TVJU
$MBTTFT FU NÏUIPEFT HÏOÏSJRVFT
%F QMVT JM GBVU SÏUBCMJS MIÏSJUBHF EFT DMBTTFT FU WFST
FU
-PSTRVVOF DMBTTF IÏSJUF EVOF DMBTTF BCTUSBJUF FMMF EPJU
● TPJU JNQMÏNFOUFS MFT NÏUIPEFT BCTUSBJUFT EF TB TVQFSDMBTTF FO MFT EPUBOU EVO DPSQT
● TPJU ÐUSF FMMFNÐNF BCTUSBJUF TJ BV NPJOT VOF EFT NÏUIPEFT BCTUSBJUFT EF TB TVQFSDMBTTF SFTUF BCTUSBJUF
$MBTTFT FU NÏUIPEFT HÏOÏSJRVFT
*M FTU QBSGPJT VUJMF EF EÏĕOJS EFT DMBTTFT QBSBNÏUSÏFT QBS VO UZQF EF EPOOÏFT PV VOF DMBTTF 1BS FYFNQMF EBOT MF QBDLBHF EF OPNCSFVTFT DMBTTFT TPOU HÏOÏSJRVFT FU OPUBNNFOU MFT DMBTTFT SFQSÏTFOUBOU EFT FOTFNCMFT FUD $FT DMBTTFT TPOU HÏOÏSJRVFT EBOT MF TFOT Pá FMMFT QSFOOFOU FO QBSBNÒUSF VO UZQF DMBTTF PV JOUFSGBDF RVFMDPORVF FTU FO RVFMRVF TPSUF VOF WBSJBCMF RVJ QFVU QSFOESF DPNNF WBMFVS VO UZQF EF EPOOÏ $FDJ TF OPUF DPNNF TVJU FO
QSFOBOU MFYFNQF EF
/PVT QPVWPOT SFNBSRVFS RVF MF UZQF QBTTÏ FO QBSBNÒUSF FTU OPUÏ FOUSF DIFWSPOT FY FU RVJM QFVU FOTVJUF ÐUSF SÏVUJMJTÏ EBOT MF DPSQT EF MB DMBTTF QBS EFT NÏUIPEFT FY MB NÏUIPEF
SFOWPJF VO ÏMÏNFOU EF DMBTTF
*M FTU QPTTJCMF EF EÏĕOJS EFT DPOUSBJOUFT TVS MF UZQF QBTTÏ FO QBSBNÒUSF DPNNF QBS FYFNQMF
Les classes doivent soit être déclarée abstraite, soit définir
le corps de méthodes abstracts : surface() et affiche().
Redéfinition de méthodes existantes
La classe B doit redefinir la method mA ou être declarer come abstract
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(){}
}
public class B extends A{
public B (int x){
super(x);
public abstract class B extends A{
public B (int x){
super(x);