• Aucun résultat trouvé

UE 2I002 (ex LI230) : éléments de programmation par objets avec Java TD7 - Héritage et classe abstraite

N/A
N/A
Protected

Academic year: 2022

Partager "UE 2I002 (ex LI230) : éléments de programmation par objets avec Java TD7 - Héritage et classe abstraite"

Copied!
11
0
0

Texte intégral

(1)

UE 2I002 (ex LI230) : éléments de programmation par objets avec Java

TD7 - Héritage et classe abstraite

! !

Juliana Silva Bernardes

[email protected]

(2)

‣Héritage

‣Classes et méthodes abstracts

‣Redéfinition de méthodes existantes

Sumary

(3)

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.

(4)

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 +"]";

}

}

(5)

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!");

} }

(6)

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.

(7)

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

(8)

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

(9)

‣ 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)

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().

(11)

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);

ou

}

Références

Documents relatifs

– et d’e↵ectuer les instructions n´ecessaires pour la cr´eation d’un objet de cette classe Les constructeurs sont appel´es quand on cr´ee (mot-cl´e new) un objet de cette

On ne peut pas utiliser l’opérateur « point » (.) sur les variables de la classe Chien ailleurs que dans la classe Chien

UE 2I002 (ex LI230) : éléments de programmation par objets avec Java!. TD4 - Composition,

‣ Un tableau est une structure de données contenant un groupe d'éléments tous du même type. ‣ Le type des éléments peut être un type primitif ou

‣ boolean, byte, short, char, int, long, float et double, sont associées des classes Boolean, Byte, Short, Character, Integer, Long, Float et Double. ‣ Ces classes ont des

6OF EFT QSPQSJÏUÏT JOEVJUFT QBS MF QPMZNPSQIJTNF FTU RVF MJOUFSQSÏUFVS +BWB FTU DBQBCMF EF USPVWFS MF USBJUFNFOU Ë FČFDUVFS MPST EF MBQQFM EVOF NÏUIPEF TVS VO PCKFU &#34;JOTJ

‣ On peut affecter à un champ ou une variable d'un type une expression de type moins élevé dans la hiérarchie des types. int a

Depuis le début de l’année, nous utilisons systématiquement la méthode main avec un paramètre de type String[], c’est à dire un tableau de chaînes de caractères. Ce