Prog Orientee Objet

Embed Size (px)

Citation preview

  • 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