Prog Orientee Objet
Transcript of Prog Orientee Objet
-
7/23/2019 Prog Orientee Objet
1/82
Java et Objet
Amlie Lambert
2014-2015
Amlie Lambert 2014-2015 1 / 82
-
7/23/2019 Prog Orientee Objet
2/82
Chapitre 5
Programmation oriente objet
Amlie Lambert 2014-2015 2 / 82
-
7/23/2019 Prog Orientee Objet
3/82
Plan du cours
Analyse, conception et programmation Oriente Objets
Lhritage
Le polymorphismeLes classes abstraites
Les interfaces
Exercices
Amlie Lambert 2014-2015 3 / 82
-
7/23/2019 Prog Orientee Objet
4/82
Analyse, conception et
programmation Oriente Objets
Amlie Lambert 2014-2015 4 / 82
-
7/23/2019 Prog Orientee Objet
5/82
Analyse et conception Oriente Objet
Identifier les objets du domaine dapplication
Dcrire les diffrents attributs
tablir les relations entre les diffrents objets
Former les groupes dobjets
Amlie Lambert 2014-2015 5 / 82
-
7/23/2019 Prog Orientee Objet
6/82
Les objets et leurs attributs
Pour dcrire les objets et leurs attributs, on utilise diffrents diagrammes :
Diagramme de classe
Diagramme dobjet
Amlie Lambert 2014-2015 6 / 82
-
7/23/2019 Prog Orientee Objet
7/82
Diagramme de classe
Ce diagramme est utilis pour prsenter les classes des systmes ainsi queles diffrentes relations entre celles-ci.
Il doit dcrire le comportement et le type dun ensemble dobjets.
PolygoneRegulier
-nbCotes:int
-longueur:double
+perimetre():double
+surface():double
Amlie Lambert 2014-2015 7 / 82
-
7/23/2019 Prog Orientee Objet
8/82
Diagramme dobjet
Ce diagramme permet de reprsenter les instances des classes, cest--diredes objets.
En plus du diagramme de classes, il exprime ltat des objets, ce quipermet dexprimer des contextes dexcution.
pr1 :PolygoneRegulier
nbCotes=6
longueur=8.7
pr1 :PolygoneRegulier
nbCotes=4
longueur=12.8
Amlie Lambert 2014-2015 8 / 82
-
7/23/2019 Prog Orientee Objet
9/82
Les relations entre les diffrents objets
Lassociation
Lagrgation
La composition simple ou multiple
Lhritage
Modles dynamique
Amlie Lambert 2014-2015 9 / 82
-
7/23/2019 Prog Orientee Objet
10/82
Lassociation
Uneassociation exprime une connexion smantique entre deuxclasses.
Elle dcrit un groupe de liens ayant une structure et une smantiquecommune. Elle exprime une relation structurelle entre deux classes.
Amlie Lambert 2014-2015 10 / 82
-
7/23/2019 Prog Orientee Objet
11/82
Lassociation (traduction en Java)
public class Personne
{ privateString nom;private Vector lesVols; // lassociation est reprsente par le vecteur lesVols
public Personne( String nom ){lesVols = new Vector();this.nom = nom;
}
public void reserve( Vol v ){lesVols.addElement( v );
}
public boolean passager( Vol v ){
return lesVols.contains( v );}
...}
Amlie Lambert 2014-2015 11 / 82
-
7/23/2019 Prog Orientee Objet
12/82
Lassociation dune classe sur elle-mme
Il galement est possible de dfinir une association entre une classe etelle-mme.
Amlie Lambert 2014-2015 12 / 82
-
7/23/2019 Prog Orientee Objet
13/82
Lassociation dune classe sur elle-mme (traduction enJava)
public class Personne{privateString nom;privatePersonne epoux = null; // lassociation est reprsente par la Personne epoux.private boolean marie = false;
public Personne( String nom ){this.nom = nom;
}
public void marie( Personne p ){epoux = p;marie = true;
}
public boolean marie(){return marie;
}...
}
Amlie Lambert 2014-2015 13 / 82
-
7/23/2019 Prog Orientee Objet
14/82
Lagrgation
Lagrgation exprime une association avec relation de subordination.
Elle est reprsente par un trait reliant les deux classes et dont lorigine(classe contenante) se distingue par un losange de lautre extrmit (classesubordonne).
Une des classes "regroupe" dautres classes. On peut dire que lobjet Tutilise une instance de la classe T.
Amlie Lambert 2014-2015 14 / 82
-
7/23/2019 Prog Orientee Objet
15/82
Lagrgation (traduction en Java)
public class ListeClients{privateVector laListe; // lagrgation est reprsente par le vecteur
// de Personne laListe
public ListeClients(){laListe = new Vector();
}public void inclus( Personne p ){
laListe.add( p );}public Vector laListe(){
return laListe;}
}
public class Personne{privateString nom;public
Personne( String nom ){this.nom=nom;}public boolean client( ListeClients l ){
return (l.laListe()).contains( this );}
}
Amlie Lambert 2014-2015 15 / 82
-
7/23/2019 Prog Orientee Objet
16/82
Association + Agrgation
Il est possible de combiner lassociation et lagrgation.
Amlie Lambert 2014-2015 16 / 82
-
7/23/2019 Prog Orientee Objet
17/82
Association + Agrgation (traduction en Java)public class Personne{
privateString nom;
privatePersonne epoux = null;// lassociation est reprsente par la Personne Epouxprivate boolean marie = false;public Personne( String nom ){
this.nom=nom; }public void marie( Personne p ){
epoux = p;marie = true; }
public boolean marie(){return marie; }
public boolean client( ListeClients l ){return (l.laListe()).contains( this );}}
public class ListeClients{
privateVector laListe; // lagrgation est reprsente par le vecteur laListepublic ListeClients(){
laListe = new Vector();}public void inclus( Personne p ){
laListe.add( p ); }public Vector laListe(){
return laListe;}}
Amlie Lambert 2014-2015 17 / 82
-
7/23/2019 Prog Orientee Objet
18/82
La composition
La composition est une variante plus forte de lagrgation.En gnral, le cycle de vie des deux classes en relation est dpendant. Si laclasse contenante est dtruite, la classe subordonne est dtruite.
Elle est reprsente par un trait reliant les deux classes et dont lorigine
(classe contenante) se distingue par un losange noir de lautre extrmit(classe subordonne).
Amlie Lambert 2014-2015 18 / 82
L i i ( d i j )
-
7/23/2019 Prog Orientee Objet
19/82
La composition (traduction en java)
public class Moteur{
privateCylindre[] lesCylindres; // la composition est reprsente par le vecteur lesCylindrespublic Moteur()
{lesCylindres = new Cylindre[8];
}...}
Amlie Lambert 2014-2015 19 / 82
L i i l i l
-
7/23/2019 Prog Orientee Objet
20/82
La composition multiple
La composition peut tre multiple : la classe contenante a alorsplusieurs classes subordonnes.
Amlie Lambert 2014-2015 20 / 82
L i i l i l ( d i J )
-
7/23/2019 Prog Orientee Objet
21/82
La composition multiple (traduction Java)
public class Vehicule{
privateMoteur moteur; // la composition multiples est reprsente par moteurprivateRoue[] roues; // le tableau rouesprivateCaisse caisse; // caisseprivateHabitacle habitacle; // et habitacle
public Vehicule(){moteur = new Moteur();
roues = new Roue[4];caisse = new Caisse();habitacle = new Habitacle();
}
public Vehicule( Moteur moteur,Roue[] roues, Caisse caisse,Habitacle habitacle){this.moteur = moteur;
this.roues = roues;this.caisse = caisse;this.habitacle = habitacle;
}...
}
Amlie Lambert 2014-2015 21 / 82
Lh it
-
7/23/2019 Prog Orientee Objet
22/82
L hritage
La relation dhritage indique que la "sous-classe" (classe fille) estune spcification de la "super-classe" (classe mre).
La classe fille hrite de tous les attributs et mthodes de la classe mre, onva du gnral au particulier.
Elle est reprsente par un trait reliant les deux classes et dont lorigine(classe mre) se distingue de lautre extrmit (classe fille) par un triangle.
Amlie Lambert 2014-2015 22 / 82
Lh it (t d ti J )
-
7/23/2019 Prog Orientee Objet
23/82
L hritage (traduction Java)
public class Voiture extends Vehicule{ // lheritage est reprsent par le mot cl extends...
}
public class Bateau extends Vehicule{...
}
public class Train extends Vehicule{...
}
public class Velo extends Vehicule{
...}
Amlie Lambert 2014-2015 23 / 82
Association + Hritage
-
7/23/2019 Prog Orientee Objet
24/82
Association + Hritage
Il est possible de mixer association et hritage.
Amlie Lambert 2014-2015 24 / 82
Association + Hritage (traduction en Java)
-
7/23/2019 Prog Orientee Objet
25/82
Association + Hritage (traduction en Java)public class Personne {
protected String nom;... }
public class Cours{... }
public class Etudiant extends Personne{ // lheritage est reprsent par le mot cl extendsprivateVector lesCours; // lassociation est reprsente par le vecteur lesCourspublic Etudiant( String nom ){
lesCours = new Vector();this.nom = nom; }public void suit( Cours cours ){
lesCours.addElement( cours );}}
public class Enseignant extends Personne{ // lheritage est reprsent par le mot cl extends
privateVector lesCours; // lassociation est reprsente par le vecteur lesCourspublic Enseignant( String nom ){
lesCours = new Vector();this.nom = nom;}
public void enseigne( Cours cours ){lesCours.addElement( cours ); }
}
Amlie Lambert 2014-2015 25 / 82
Exercice 1 (1/5)
-
7/23/2019 Prog Orientee Objet
26/82
Exercice 1 (1/5)
Des personnes dfinies par leur nom peuvent acheter une ou plusieursvoitures (dfinies par leur modle).
Chaque voiture peut possder un autoradio (avec ou sans lecteur de CD).
Cet autoradio est extractible. Le propritaire de lautoradio est une
personne qui nest pas obligatoirement celui de la voiture.
1 Tracer le diagramme UML correspondant
2 Implanter ce diagramme en Java
Amlie Lambert 2014-2015 26 / 82
Exercice 1 (2/5)
-
7/23/2019 Prog Orientee Objet
27/82
Exercice 1 (2/5)
Amlie Lambert 2014-2015 27 / 82
Exercice 1 (3/5)
-
7/23/2019 Prog Orientee Objet
28/82
Exercice 1 (3/5)
public class Personne{
privateString nom;privateVector radios; // lassociation est reprsente par le vecteur radiosprivate boolean possede = false;privateVector voitures; // lassociation est reprsente par le vecteur voitures
public Personne( String nom ){this.nom = nom;
voitures = new Vector();}
public void possede( Radio radio ){radios.addElement(radio);possede = true;}
public boolean possedeRadio(){
return possede;}
public void achete( Voiture voiture ){voitures.addElement( voiture );}
}
Amlie Lambert 2014-2015 28 / 82
Exercice 1 (4/5)
-
7/23/2019 Prog Orientee Objet
29/82
Exercice 1 (4/5)
public class Voiture{
privateString modele;
privateRadio radio = null; // lagregation est representee par le Radio radio
public Voiture( String modele ){this.modele = modele; }
public void installe( Radio radio ){if(!radio.getInstalle()){
this.radio = radio;this.radio.setInstalle(true);
}}
public void desinstalle(){if(this.installe !=null){
this.radio.setInstalle(false);this.radio=null;
}}
public Radio getRadio(){return radio; }
}
Amlie Lambert 2014-2015 29 / 82
Exercice 1 (5/5)
-
7/23/2019 Prog Orientee Objet
30/82
Exercice 1 (5/5)public class Radio{
private boolean installe; // lagregation est representee par le boolean installe
public Radio(){this.installe=false; }
public void setInstalle(boolean b){this.installe = b; }
public boolean getInstalle(){return this.installe; }}
public class Client{public static void main ( String[] args ){
Personne personne = new Personne( "Ledoux" );
Voiture voiture = new Voiture( "Renault" );Radio radio = new Radio();voiture.installe( radio );personne.achete( voiture );personne.possede(voiture.getRadio() );
}}
Amlie Lambert 2014-2015 30 / 82
-
7/23/2019 Prog Orientee Objet
31/82
Lhritage
Amlie Lambert 2014-2015 31 / 82
Le principe de lhritage (1/3)
-
7/23/2019 Prog Orientee Objet
32/82
Le principe de l hritage (1/3)
Les hirarchies de classes (classification) permettent de grer lacomplexit en ordonnant les objets au sein darborescence declasses dabstraction croissante.
Les classes descendantes hritent des proprits des classes anctres.
Exemple :
Vertbrs Mammifres Hominids Hommes
Amlie Lambert 2014-2015 32 / 82
Le principe de lhritage : Exemple (2/3)
-
7/23/2019 Prog Orientee Objet
33/82
p p g p ( /3)
Amlie Lambert 2014-2015 33 / 82
Le principe de lhritage (3/3)
-
7/23/2019 Prog Orientee Objet
34/82
p p g ( / )
Une classe anctre dune classe descendante est appelesuper-classe.
La classe decendante possde obligatoirement tous les attributset mthodes de ses super-classes.
Elle se diffrencie par la possibilit :
Dajouter de nouvelles variables dinstance
Dajouter de nouvelles mthodes
De redfinir des mthodes de la super-classe
Amlie Lambert 2014-2015 34 / 82
Hritage et diagramme de classe
-
7/23/2019 Prog Orientee Objet
35/82
g g
Il est possible de reprsenter lhritage par un diagramme de classes.
Amlie Lambert 2014-2015 35 / 82
Hritage (traduction en Java) (1/2)
-
7/23/2019 Prog Orientee Objet
36/82
g ( ) ( / )
public class PolygoneRegulier{protected int nbCotes;protected double longueur;
public PolygoneRegulier( int n,double l ){nbCotes = n;longueur = l;}
public double perimetre(){return nbCoteslongueur;}
public double surface(){return nbCoteslongueurlongueur/4Math.tan(3.14/nbCotes);}
}
public class Carre extends PolygoneRegulier{public Carre( double l ){
nbCotes = 4;longueur = l;}
public double surface(){return longueurlongueur;}
}
Amlie Lambert 2014-2015 36 / 82
Hritage (traduction en Java) (2/2)
-
7/23/2019 Prog Orientee Objet
37/82
( ) ( / )
public class Hexagone extends PolygoneRegulier{
public Hexagone( double l ){nbCotes = 6;longueur = l; }
}
public class Exercice{public static void main(String[] args){
Carre carre = new Carre(5.7);double p = carre.perimetre();// perimetre est hrite de PolygoneReguliercarre.surface();// surface est redfinie dans la classe CarreHexagone hexagone = new Hexagone(3.9);
double surface = carre.surface()+hexagone.surface();// la mthode surface() de Carre puis celle de Hexagone sont invoques }}
Amlie Lambert 2014-2015 37 / 82
La protection lors de lhritage
-
7/23/2019 Prog Orientee Objet
38/82
Les membres (variables dinstance, constantes, mthodes) dclarespublic sont accessibles par tout objet
Les membres dclars private ne sont accessibles que dans lesmthodes de la classe
Les membres protectedsont accessibles seulement par :
Les membres de la classe Les membres de chacune des sous classes quel que soit le
package dappartenance
Si aucun modificateurde protection nest spcifi pour une classe,
ses membres sont accessibles par tous les membres des autres classesdu mme package
Remarque :si toutes les sous-classes appartiennent au mmepackage, accs protectedou par dfaut sont quivalents
Amlie Lambert 2014-2015 38 / 82
Les rgles de visibilit
-
7/23/2019 Prog Orientee Objet
39/82
visibilit private par dfaut protected publicautre classe dumme package
non oui oui oui
sous classe dunautre package
non non oui oui
Amlie Lambert 2014-2015 39 / 82
Exercice 2 (1/4)
-
7/23/2019 Prog Orientee Objet
40/82
Nous revenons vers la classe Radio. On souhaite crer un nouveau modle
de radio capable de lire des CDs.
1 Concevoir une nouvelle classe RadioCD partir de la classe existante
Radio.2 La classe Radio est-elle assez gnrale pour devenir super-classe de
RadioCD ? sinon comment faut-il la modifier ?
3
Le programme principal cre une instance de cette nouvelle classe avecles stations prrgles, coute la station 4 puis 89.9 puis insre une CDlcoute, lenlve et coute la station 93.5
Amlie Lambert 2014-2015 40 / 82
Exercice 2 (2/4)
-
7/23/2019 Prog Orientee Objet
41/82
class Radio{protected double[] stations = new double[5];
public Radio(){}
public Radio(double[] stations){this.stations = stations;
}
public void preregler(int index, double frequence){stations[index] = frequence;}
public void ecouter(int index){System.out.println("Ecoutedelastation:"+stations[index]+"Mhz");
}
public void ecouter(double frequence){System.out.println("Ecoutedelastation:" + frequence+ "Mhz");
}}
Amlie Lambert 2014-2015 41 / 82
Exercice 2 (3/4)
-
7/23/2019 Prog Orientee Objet
42/82
class RadioCD extends Radio{private boolean cdIn = false;
public RadioCD(double[] stations){super(stations);}
public void insererCD(){cdIn = true;System.out.println("\t>CDinsr");}
public void enleverCD(){cdIn = false;System.out.println("\t>CDenlev");}
public void ecouter(){if(cdIn)
System.out.println("\t>lectureduCD");else
System.out.println("\t>insrerunCDdabord");}}
Amlie Lambert 2014-2015 42 / 82
Exercice 2 (4/4)
-
7/23/2019 Prog Orientee Objet
43/82
public class Exercice2{public static void main(String[] args){double[] stations = {101.5, 87.9, 105.1, 95, 101.1};Radio radio = new Radio(stations);radio.ecouter(3);radio. ecouter(93.5);RadioCD radioCD = new RadioCD(stations);
radioCD. ecouter(2);radioCD. ecouter(89.9);radioCD.insererCD();radioCD. ecouter();radioCD.enleverCD();radioCD. ecouter(93.5);
}
}
Amlie Lambert 2014-2015 43 / 82
La surcharge et la redfinition
-
7/23/2019 Prog Orientee Objet
44/82
Plusieurs mthodesdune mme classe peuvent avoir lemme nom condition davoir des signatures diffrentes (nombre et/ou typesdes paramtres diffrents). On dit quelles sont surcharges.
Exemple :void afficher(String s);
void afficher(int i,Object o);
Le compilateur sappuie sur la signature des mthodes pour choisirsans ambigut la mthode appliquer.
La surcharge est un mcanisme qui sapplique aussi aux constructeurs.
En revanche, lors de lhritage, une mthode redfinie possde la
mme signature et le mme type de retour que la mthode dela super classe.
Unevariable dinstance, une variable ou une mthode static nepeuvent pas tre redfinies.
Amlie Lambert 2014-2015 44 / 82
La surcharge et la redfinition (exemple )
-
7/23/2019 Prog Orientee Objet
45/82
class Surcharge{void afficherValeur( ){
System.out.println("aucunevaleurdefinie"); }void afficherValeur(long x){System.out.println("valeurentiereegalea"+x); }
void afficherValeur(double x){System.out.println("valeurflottanteegalea"+x); }
void afficherValeur(String s, int x){System.out.println(s+x); }
}class Test{
public static void main(String[ ] args){Surcharge sRef = new Surcharge( ) ;sRef.afficherValeur( ) ;sRef.afficherValeur(3.14159) ;
}
}
Aucune valeur dfinie
valeur flottante gale 3.14159
Amlie Lambert 2014-2015 45 / 82
La surcharge et la redfinition (ambiguit)Il h i 2 h d diff i l d l
-
7/23/2019 Prog Orientee Objet
46/82
Il ny a pas surcharge si 2 mthodes ne se diffrencient que par le type de lavaleur retourne
class A {double g(){....}int g(){....}
}
le compilateur dcle une ambigut
Il y a surcharge si 2 mthodes ont mme nombre et mme type de
paramtres mais dans un ordre diffrentclass A {
int g(double d, int i){....}int g(int i, double d){....}
}
compilation OK
Mais
A a = new A();a.g(5,5); ambigut : le compilateur ne sait pas
quelle mthode choisir
Amlie Lambert 2014-2015 46 / 82
La notion de Sous-classement
-
7/23/2019 Prog Orientee Objet
47/82
Il est possible daffecter un objet de classe mre un objet de classe fille.
Supposons que la classe Hexagone(classe fille) hrite de la classePolygoneRegulier(classe mre).
PolygoneRegulier poly = new PolygoneRegulier(5,2.5);Hexagone hexa = new Hexagone(4.67);poly = hexa;
Cette affectation est lgale. Aprs affectation, polycontient une rfrence un objet, instance dune sous-classe de PolygoneRegulier, or unHexagoneest un PolygoneRegulier.
Pour la mme raison, et puisque tout est objet, il est tout aussi lgal
dcrire :
Object o = new Object();o = hexa;
Amlie Lambert 2014-2015 47 / 82
Sous-typage
-
7/23/2019 Prog Orientee Objet
48/82
Dfinition :
Soit STun sous-type de T, alors toute valeur de STpeut-tre utiliseen lieu et place dune valeur du type T.
si SCest sous-classe de T, alors SCest sous-type de T
Exemple :
si poly.surface()est valide, alors hexa.surface()le sera aussi Lesclasses PolygoneRegulieret Hexagone:
sont en relation de sous-classement sont en relation de sous-typage
Amlie Lambert 2014-2015 48 / 82
Sous-classement et sous-typage (Exemple)
-
7/23/2019 Prog Orientee Objet
49/82
On ajoute la mthode dessiner Hexagone:
public void dessiner(){...
}
Supposons maintenant le morceau de programme :
poly = hexa;poly.dessiner();
Que se passe-t-il ?
Une erreur surviendra la compilation, car le type de poly(PolygoneRegulier) ne possde pas de mthode dessiner()
Amlie Lambert 2014-2015 49 / 82
Sous-classement et sous-typage (Exemple)
-
7/23/2019 Prog Orientee Objet
50/82
On ajoute la mthode suivante la classe PolygoneRegulier:
public booleanplusGrand(PolygoneRegulier p){return this.surface()>p.surface();
}
PolygoneRegulier poly = new PolygoneRegulier( 5,2.5 );Hexagone hexa = new Hexagone( 4.67 );if( poly.plusGrand(hexa) )
System.out.println( "poly>hexa" );else
System.out.println( "poly
-
7/23/2019 Prog Orientee Objet
51/82
Le transtypage consiste convertir une valeur d un type dans unautre type.
Exemples :hexa = poly;
Cette affectation est illgale : types incompatiblespoly = hexa;
Pour rendre possible lappel la mthode :poly.dessiner();
Il faut vrifier si polycontient une rfrence sur une instancedHexagone:if( poly instanceofHexagone ){
Hexagone h = (Hexagone)poly; // conversion de type
h.dessiner();}
Carre c = new Carre(5);Hexagone h = new Hexagone(3);c = h; // types incompatiblesc = (Carre)h; // types inconvertibles
Amlie Lambert 2014-2015 51 / 82
La pseudo variable super
-
7/23/2019 Prog Orientee Objet
52/82
Une variable dinstance ou une mthode dune sous-classe peut avoirle mme nom que celle de sa super-classe
Pour utiliser la variable dinstance ou la mthode de la super-classe, onutilise le mot cl super
Exemple :
Appel de la mthode surface()de la classe mrePolygoneRegulierdun Hexagone h:
System.out.println("Lasurfacedehest" +super.surface());
Amlie Lambert 2014-2015 52 / 82
Constructeurs et hritage
-
7/23/2019 Prog Orientee Objet
53/82
public class Point{
protected int x,y;public Point( int x,int y ){this.x = x;this.y = y;
}...
}
public class Cercle extends Point{private int rayon;public Cercle( int x,int y,int r ){
super( x,y );rayon = r;
}
...}
Amlie Lambert 2014-2015 53 / 82
-
7/23/2019 Prog Orientee Objet
54/82
Polymorphisme
Amlie Lambert 2014-2015 54 / 82
Polymorphisme
-
7/23/2019 Prog Orientee Objet
55/82
Le polymorphisme permet des objets de types diffrents dtre
manipuls avec une interface uniforme. Cest un des concepts essentielsde la programmation oriente objet
polymorphismevient du grec et signifie qui peut prendre plusieursformes
Le polymorphisme signifie quune mme opration peut setraduire diffremment selon lobjet sur laquelle elle sapplique:cest la capacit dun objet prendre plusieurs formes.
Alors que lhritage concerne les classes (et leur hirarchie), lepolymorphisme est relatif aux mthodes des objets.
Amlie Lambert 2014-2015 55 / 82
Exemple
-
7/23/2019 Prog Orientee Objet
56/82
// Reprenons la hirarchie PolygoneRegulier, et ajoutons la classe LiaisonRetardee
public class LiaisonRetardee{public static void main( String[] args )throws IOException{
PolygoneRegulier p;char reponse;Scanner in = new Scanner(System.in);System.out.println( "Polygonergulier(p,c,h)?" );reponse = in.next().charAt( 0 );switch ( reponse ){
case c:p =new Carre(...);case h:p =new Hexagone(...);case p:p =new PolygoneRegulier(...);
}System.out.println( "surfacedep="+p.surface() );
}}
Amlie Lambert 2014-2015 56 / 82
Polymorphisme
-
7/23/2019 Prog Orientee Objet
57/82
On ne connat qu lexcution la classe dappartenance de lobjet
dont la rfrence est affecte p.
Le choix du code excuter pour une mthode polymorphe ne sefait pas statiquement la compilation mais dynamiquement lexcution.
Le polymorphisme trouve son intrt lorsque lon veut construiredynamiquement des structures de donnes dont les lments sont desrfrences dobjets dune mme hirarchie.
En effet, la dclaration dune telle structure impose un type identique tous les objets quelle est susceptible de contenir
Amlie Lambert 2014-2015 57 / 82
Polymorphisme : exemple
-
7/23/2019 Prog Orientee Objet
58/82
PolygoneRegulier[] p = new PolygoneRegulier[3];
Hexagone h = new Hexagone();Carre c = new Carre();PolygoneRegulier r = new PolygoneRegulier();p[0] = h;p[1] = c;p[2] = r;for( int i=0;i
-
7/23/2019 Prog Orientee Objet
59/82
j {public void m(){
System.out.println("mdelaclasseA");}
}
class B extends A{public void m(){
System.out.println("mdelaclasseB");}
}
public class Poly03{public static void main( String[] args ){
Object var = new B();((B)var).m();((A)var).m();
var.m();var = new A();((A)var).m();
}}
Quel est le rsultat de chaque ligne de code ?Amlie Lambert 2014-2015 59 / 82
Exercice 3 (2/2)
-
7/23/2019 Prog Orientee Objet
60/82
Object var = new B();((B)var).m();// On applique la mthode m de la classe B((A)var).m();// Polymorphisme : On applique la mthode m de la classe B, plutot que celle de Avar.m(); // chec la compilation : la methode m nest pas dedinie dans la classe Object
var = new A();((A)var).m();// On applique la mthode m de la classe A
Amlie Lambert 2014-2015 60 / 82
-
7/23/2019 Prog Orientee Objet
61/82
Mthodes et classes abstraites
Amlie Lambert 2014-2015 61 / 82
Mthodes et classes abstraites
U l b i l i i i
-
7/23/2019 Prog Orientee Objet
62/82
Une classe abstraite est une classe qui ne peut pas tre instanciedirectement.
Elle nest utilisable qu travers sa descendance. Une classe abstraite doittoujours tre drive pour pouvoir gnrer des objets.
Elle est prcde du mot cl abstract
abstract class ClasseAbstraite
Lutilit dune classe abstraite est de permettre la factorisation desattributs et mthodes communs un groupe de classes.
Dans une classe abstraite, on peut trouver des mthodes abstraites,(quinont pas dimplmentation possible dans la classe abstraite), qui doiventobligatoirement tre implmentes diffremment dans toutes lesclasses filles.
Amlie Lambert 2014-2015 62 / 82
Mthodes et classes abstraites (Exemple)
-
7/23/2019 Prog Orientee Objet
63/82
Au niveau de la classe Vehicule, la mthode print()na pasbeaucoup de sens
En revanche, au niveau des sous-classes, elle permet dafficher toutesles informations utiles concernant un type de vhicule particulier
Amlie Lambert 2014-2015 63 / 82
Mthodes et classes abstraites (Exemple)
-
7/23/2019 Prog Orientee Objet
64/82
Amlie Lambert 2014-2015 64 / 82
Mthodes et classes abstraites (Exemple)
-
7/23/2019 Prog Orientee Objet
65/82
public abstract class Vehicule{
protected Position position;
public abstract void print();
public void deplacer( Position position ){this.position = position;
}
...}
public class Voiture extends Vehicule{public void print(){
System.out.print( position.toString() );}
}
Amlie Lambert 2014-2015 65 / 82
Mthodes et classes abstraites
-
7/23/2019 Prog Orientee Objet
66/82
Une classe abstraite ne peut pas tre instancie, mais on peut dfinirdes constructeurs qui seront invoqus dans les sous-classes
Si une sous-classe dune classe abstraite nimplmente pas toutes les
mthodes abstraites, cette sous-classe doit tre dclare abstraite.
Une sous-classe peut tre abstraite mme si sa super-classe estconcrte (exemple la super-classe Object)
Amlie Lambert 2014-2015 66 / 82
Classe abstraite et polymorphisme
-
7/23/2019 Prog Orientee Objet
67/82
Vehicule v;
Train t = new Train();Bateau b = new bateau();boolean presse;...if(presse)
v = t;else
v = b;v.print();
Une classe abstraite sert de modle. Elle ne peut pas tre instancie.
Quelle que soit la rfrence contenue dans dans v, on a la garantie que lamthode print()est implante
Amlie Lambert 2014-2015 67 / 82
-
7/23/2019 Prog Orientee Objet
68/82
Interfaces
Amlie Lambert 2014-2015 68 / 82
Interfaces
-
7/23/2019 Prog Orientee Objet
69/82
En java, il ny a pas dhritage multiple.
Il serait donc impossible de faire hriter les classes Bateau, Train,etc.. de la classe Canvaspour leur ajouter une mthode draw()
Le concept dinterface permet de remdier cette limitation
Une classe Java nhrite que dune seule classe, mais peut implanterplusieurs interfaces
Amlie Lambert 2014-2015 69 / 82
Interfaces
-
7/23/2019 Prog Orientee Objet
70/82
Une interface est une sorte de classe abstraite qui contientuniquement :
Des dclarations de mthodes
Des constantes static
Une interface ne peut pas tre instancie
Une interface peut hriter dune autre interface
Amlie Lambert 2014-2015 70 / 82
Interfaces (exemple)
-
7/23/2019 Prog Orientee Objet
71/82
public interface Transaction{
public void ajouter( double s );public void retirer( double s );
}
public interface Comparable{/ @param o objet comparer @return 0 si lobjet est suprieur O/
public int compareTo( Object o );}
LinterfaceComparableest issu de la classe java.lang.Comparable.
Amlie Lambert 2014-2015 71 / 82
Interfaces (exemple)public class Compte implements Transaction,Comparable{
private String titulaire;
-
7/23/2019 Prog Orientee Objet
72/82
private double solde;privateString code;
public Compte( String t,String c ){titulaire = t;code = c;}
public void ajouter( double s ){solde = solde+s; }
public void retirer( double s ){solde = soldes; }
public double getSolde(){return solde; }
public int compareTo( Object o ){if( solde((Compte)o).getSolde() )
return 1;else return 0;}
}Amlie Lambert 2014-2015 72 / 82
Interfaces (exemple)
public class Reservoir implements Transaction,Comparable{i t d bl t
-
7/23/2019 Prog Orientee Objet
73/82
private double contenu;
public Reservoir( double c ){contenu = c; }
public void ajouter( double s ){contenu = contenu+s; }
public void retirer( double s ){
contenu = contenu
s; }
public double getContenu(){return contenu; }
public int compareTo( Object o ){if(contenu((Reservoir)o).getContenu())
return 1;else return 0;}
}
Amlie Lambert 2014-2015 73 / 82
Conflit de nomsinterface I1{void m(double d);
()
interface I2{void m(int i);
()
-
7/23/2019 Prog Orientee Objet
74/82
void f();void g(int i);}
void f();float g(int i);}
class A implements I1,I2{
mde I1et mde I2doivent tre dfiniespublic void m(double d){....}public void m(int i){....}
fest prsente dans les 2 interfaces, pas de conflit de noms car il suffit dedfinir une mthode fpour satisfaire les besoins dimplmentation imposspar les 2 interfaces.public void f(){....}}
Les mthodes float g(int i)de I2et void g(int i)de I1sont biendistinctes.Elles ne peuvent pas pourtant pas tre dfinies dans la classe Apuisquellesont le mme nom et les mmes arguments.Lambigut est dcele par le compilateur
Amlie Lambert 2014-2015 74 / 82
Types, classes, interfaces
-
7/23/2019 Prog Orientee Objet
75/82
Un objet peut avoir plusieurs types (celui de sa classe et celui de sonou de ses interfaces)
Diffrents objets ou instances de classes implmentant la mmeinterface peuvent tre considrs comme ayant le mme type.
Amlie Lambert 2014-2015 75 / 82
-
7/23/2019 Prog Orientee Objet
76/82
Exercices
Amlie Lambert 2014-2015 76 / 82
Exercice 4 (1/2)
Quel est le rsultat de lexcution du programme suivant :(Remarque : le constructeur sans paramtre de la classe Object est il
-
7/23/2019 Prog Orientee Objet
77/82
(Remarque : le constructeur sans paramtre de la classe Objectest-ilinvoqu lorsque new B(5)est excut ?)
public class Exo4{public static void main(String[] args){
B b = new B(5);}
}
class A{public A(){
System.out.println("JesuisdansA");}
}
public class B extends A{public B(int x){
System.out.println("JesuisdansB");}
}
Amlie Lambert 2014-2015 77 / 82
Exercice 4 (2/2)
Le programme affiche :
-
7/23/2019 Prog Orientee Objet
78/82
p g
Je suis dans A
Je suis dans B
En effet, si le constructeur de la classe drive ninvoque pas le
constructeur de la classe de base explicitement avec linstructionsuper(...), Java fait quand mme appel au constructeur, sans argument,de la classe de base : super().
Un constructeur dfinit comme suit :
public Toto(String e) {this.e = e ; }est automatiquement transform enpublic Toto(String e) { super() ; this.e = e ; }
Amlie Lambert 2014-2015 78 / 82
Exercice 5 (1/2)
Quels sont les problmes identifis la compilation du programme suivant :
-
7/23/2019 Prog Orientee Objet
79/82
Quels sont les problmes identifis la compilation du programme suivant :
public classC3{public static void main(String[] args){
B b = new B();}
}
class A{
public A(int x){System.out.println("Jevaux:"+x);
}}
public class B extends A{public B(){
System.out.println("JesuisdansB");}
}
Amlie Lambert 2014-2015 79 / 82
Exercice 5 (2/2)
-
7/23/2019 Prog Orientee Objet
80/82
Les erreurs la compilation sont :
1 le constructeur public A()est absent
2 une seule classe peut tre publique par fichier
Amlie Lambert 2014-2015 80 / 82
Exercice 7 (1/2)On veut manipuler dans un mme programme des objets caractriss par leurcouleur et leur position (respectivement de type Color et Position) et que lon
-
7/23/2019 Prog Orientee Objet
81/82
( y )pourra dplacer et afficher.
Parmi ces objets, on trouve :
des photos, caractrises par leur taille et que lon pourra compresser
des figures gomtriques, carrs et des hexagones et plus gnralement despolygones rguliers dfinis par le nombre et la longueur de leurs cots et des
cercles dfinis par leur rayon dont on pourra calculer la surface.Notons que le calcul de la surface dune photo ou que la compression dune figuregomtrique quelconque ne nous intresse pas.
On souhaite pouvoir ajouter dautres figures gomtriques possdant les mmescaractristiques et quon pourra afficher lcran, dplacer et dont on pourra
aussi calculer surface.
Proposer larchitecture qui vous parat la plus adapte. Elle sera exprime en
UML. On ne sintressera donc pas au codage des mthodes mais seulement
leur dclaration.
Amlie Lambert 2014-2015 81 / 82
Exercice 7 (2/2)
-
7/23/2019 Prog Orientee Objet
82/82
Amlie Lambert 2014-2015 82 / 82