Polymorphisme, interface et classe abstraite

Click here to load reader

  • date post

    21-Jan-2017
  • Category

    Technology

  • view

    582
  • download

    1

Embed Size (px)

Transcript of Polymorphisme, interface et classe abstraite

  • PO3T Programmation oriente objet

    Sance 4

    Polymorphisme, interface etclasse abstraite

    Sbastien Combfis, Quentin Lurkin lundi 12 octobre 2015

  • Ce(tte) uvre est mise disposition selon les termes de la Licence Creative CommonsAttribution Pas dUtilisation Commerciale Pas de Modification 4.0 International.

  • Rappels

    Extension dune classe existante par hritage

    Une sous-classe tend une super-classe

    Relation is-a

    Diffrence composition/hritage

    Redfinition de mthode

    Modification dune mthode existante de la super-classe

    Accs aux membres de la super-classe depuis la sous-classe

    Visibilit des membres (public/private/protected)

    3

  • Objectifs

    Polymorphisme des objets

    Rfrence polymorphique

    Rsolution dynamique des appels

    Interface et classe abstraite

    Interface publique

    Classe et mthode abstraite

    4

  • Polymorphisme

  • Type dun objet

    Un objet peut avoir plusieurs types

    Une instance dune sous-classe est aussi une de la super-classe

    Mthodes accessibles sont celles de toute la hirarchie

    Car les mthodes hrites sont les mthodes accessibles

    Une rfrence polymorphique peut tre convertie

    Conversion vers nimporte quel type compatible

    6

  • Reprsenter un point du plan

    Point dans le plan en coordonnes entires

    Mthode translate qui renvoie un nouveau point translat

    1 public class Point2 {3 private readonly int x, y;45 public int X { get { return x; } }6 public int Y { get { return y; } }78 public Point (int x, int y)9 {

    10 this .x = x;11 this .y = y;12 }1314 public Point translate (int dx , int dy)15 {16 return new Point (x + dx , y + dy);17 }18 }

    7

  • Point color

    Extension de la classe Point

    Ajout dune variable dinstance pour stocker la couleur

    Appel du constructeur de la super-classe pour stocker x et y

    Et code spcifique pour stocker colour

    1 public class ColouredPoint : Point2 {3 private readonly Color colour ;45 public Color Colour { get { return colour ; } }67 public ColouredPoint (int x, int y, Color colour ) : base (x, y)8 {9 this . colour = colour ;

    10 }11 }

    8

  • Hirarchie de classe

    tablissement dune hirarchie de classe

    Plusieurs classes lies par des relations dhritage

    Point

    ColouredPoint

    9

  • Redfinition de mthode

    Redfinition dune mthode

    Remplacement de la version de la super-classe

    Reprsentation en chaine de caractres dun point color

    Se base sur la mthode dj prsente dans la super-classe

    1 public class ColouredPoint2 {3 // ...45 public override string ToString ()6 {7 return string . Format ("{0} [ colour ={1}] ", base . ToString () ,

    colour );8 }9 }

    10

  • Rfrence polymorphique (1)

    Redfinition dune mthode

    Remplacement de la version de la super-classe

    Reprsentation en chaine de caractres dun point color

    Se base sur la mthode dj prsente dans la super-classe

    1 public class Program2 {3 public static void Main ( string [] args)4 {5 Point p = new Point (12 , -5);6 Console . WriteLine (p);78 ColouredPoint q = new ColouredPoint (7, 5, Color . FromArgb

    (255 , 0, 0));9 Console . WriteLine (q);

    10 }11 }

    11

  • Rfrence polymorphique (2)

    p

    Point

    Die

    12

    x

    int

    5

    y

    int

    q

    ColouredPoint

    ColouredPoint

    7

    x

    int

    5

    y

    int

    [255, 0, 0]

    colour

    Color

    Point- int x- int y+ Point Translate(int, int)+ string ToString()

    ColouredPoint- Color colour+ string ToString()

    12

  • Rfrence polymorphique (3)

    Tester le type dynamique dune rfrence

    Test de la relation is-a

    Oprateur de test de la compatibilit de type

    Variable contient une rfrence vers un objet dun type donn

    1 Console . WriteLine ((p is Point ) + " / " + (p is ColouredPoint ));2 Console . WriteLine ((q is Point ) + " / " + (q is ColouredPoint ));

    True / FalseTrue / True

    13

  • Polymorphisme (1)

    Diffrence type dune variable et celui de lobjet rfrenc

    Type statique et type dynamique

    Une variable peut avoir plusieurs types par polymorphisme

    Ces diffrents types doivent tre compatibles

    1 ColouredPoint p1;2 Point p2;34 // Type statique ColouredPoint et type dynamique ColouredPoint5 p1 = new ColouredPoint (-1, 2, Color . FromArgb (0, 255 , 0));67 // Type statique Point et type dynamique ColouredPoint8 p2 = new ColouredPoint (8, 1, Color . FromArgb (0, 0, 255));

    14

  • Polymorphisme (2)

    Type statique

    Type utilis lors de la dclaration de la variable

    Dtermin une fois pour toute la dclaration

    Limite les rfrences qui pourront tre stockes

    Uniquement pour les langages typs statiquement

    Type dynamique

    Type de lobjet rfrenc par la variable

    Dtermin lors de lexcution

    Peut changer en cours dexcution

    15

  • Conversion implicite

    Objet dune sous-classe dans variable dune super-classe

    Conversion implicite de la rfrence

    1 ColouredPoint p;2 Point q;34 p = new ColouredPoint (7, 5, Color . FromArgb (255 , 0, 0));5 q = p;6 Console . WriteLine (q);

    (7, 5) [ colour = Color [A=255 , R=255 , G=0, B=0]]

    16

  • Conversion explicite

    Variable dune super-classe vers objet dune sous-classe

    Conversion explicite de la rfrence

    1 Point p;2 ColouredPoint q;34 p = new ColouredPoint (7, 5, Color . FromArgb (255 , 0, 0));5 if (p is ColouredPoint )6 {7 q = ( ColouredPoint ) p;8 Console . WriteLine (q);9 }

    (7, 5) [ colour = Color [A=255 , R=255 , G=0, B=0]]

    17

  • Type compatible

    Deux types compatibles sont lis par une relation de filiation

    Sous-classe compatible avec super-classe

    Attention, la compatibilit est unidirectionnelle

    Dans le sens de la relation is-a

    Conversions si type dynamique de b compatible avec A

    Implicite : A a = b;

    Explicite : A a = (A) b;

    18

  • Rsolution des appels de mthode (1)

    Le type statique dtermine les mthodes accessibles

    Les seules mthodes accessibles sont celles du type statique

    La mthode effectivement appele dpend du type dynamique

    En cas de redfinition, la mthode de la sous-classe est appele

    Rsolution en deux tapes

    Mthodes accessibles vrifies la compilation

    Mthode appele dcide lexcution

    19

  • Rsolution des appels de mthode (2)

    Mthode sous-classe non accessible

    Car le type statique est celui de la super-classe

    1 Point p = new ColouredPoint (7, 5, Color . FromArgb (255 , 0, 0));23 Console . WriteLine (p. Colour );

    error CS1061 : Type Cours4 .Point does not contain a definitionfor Colour and no extension method Colour of type Cours4 .Point could be found . Are you missing an assembly reference ?

    20

  • Rsolution des appels de mthode (3)

    Mthode redfinie dans sous-classe appele

    Mme si type statique de la variable est de la super-classe

    1 Point p = new ColouredPoint (7, 5, Color . FromArgb (255 , 0, 0));23 Console . WriteLine (p. ToString ());

    (7, 5) [ colour = Color [A=255 , R=255 , G=0, B=0]]

    21

  • Rsolution des appels de mthode (4)

    Mthode hrite accessible dans la sous-classe

    La mthode translate est hrite par la sous-classe

    Le type de retour de la mthode reste nanmoins Point

    Comment faire pour renvoyer un ColouredPoint ?

    1 ColouredPoint p = new ColouredPoint (7, 5, Color . FromArgb (255 , 0,0));

    23 Console . WriteLine (p. Translate (1, -1));

    (8, 4)

    22

  • Et en Python... (1)

    1 class Point :2 def __init__ (self , x, y):3 self.__x = x4 self.__y = y56 @property7 def x(self):8 return self.__x9

    10 @property11 def y(self):12 return self.__y1314 def translate (self , dx , dy):15 return Point (self.__x + dx , self.__y + dy)1617 def __str__ (self):18 return ({} , {}) . format (self.__x , self.__y)1920 p = Point (12 , -5)21 print (p)

    (12 , -5)

    23

  • Et en Python... (2)

    1 class ColouredPoint ( Point ):2 def __init__ (self , x, y, colour ):3 Point . __init__ (self , x, y)4 self. __colour = colour56 @property7 def colour (self):8 return self. __colour9

    10 def __str__ (self):11 return {} [ colour ={}] . format ( Point . __str__ (self), self.

    __colour )1213 q = ColouredPoint (7, 5, red )14 print (q)1516 print ( isinstance (q, Point ))

    (7, 5) [ colour =red]True

    24

  • Et en Java... (1)

    1 public class Point2 {3 private final int x, y;45 public Point (int x, int y)6 {7 this .x = x;8 this .y = y;9 }

    1011 public int getX () { return x; }12 public int getY () { return y; }1314 public Point translate (int dx , int dy)15 {16 return new Point (x + dx , y + dy);17 }1819 @Override20 public String toString ()21 {22 return String . format ("(%d, %d)", x, y);23 }24 }

    25

  • Et en Java... (2)

    1 class ColouredPoint extends Point2 {3 private final Color colour ;45 public ColouredPoint (int x, int y, Color colour )6 {7 super (x, y);8 this . colour = colour ;9 }

    1011 @Override12 public String toString ()13 {14 return String . format ("%s [ colour =%s]", super . toString () ,

    colour );15 }16 }

    1 ColouredPoint q = new ColouredPoint (7, 5, Color .RED);2 System .out. println (q);34 System .out. println (q instanceof ColouredPoint );

    26

  • Et en PHP... (1)

    1

    27

  • Et en PHP... (2)

    1

    28

  • Interface et classe abstraite

  • Interface

    Une interface ne contient que des enttes de mthode

    Permet de dfinir un contrat