H1 MOB1 03 : polymorphisme
Vidéo 1 : MOB1 03 01 Static Polymorphism (40 min)
MOB1 03 : polymorphisme
Plymorphisme static (vidéo 1)
Surcharge
Masquage
Plymorphisme dynamique
Ré-ecriture
Surcharge, masquage, Ré-écriture
Méthode abstraite
Interface Java
Sous-classe VS sous-typage
Probeleme
Principe de substitution de Liskov
Propriétés
H2 Plymorphisme static (vidéo 1)
Forme de polymorphisme resolue au moment de la compilation
H3 Surcharge
Méthode homonyme distiguer par leurs prototype (surtout paramètres)
Exemple c++
1 class Point
2 {
3 public
4 Point (double x, double y) : x_ (x), y_ (y) {};
5 Point () : Point(0, 0) {};
6 void translate(double x, double y)
7 {
8 x_ += x;
9 y_ += y;
10 }
11 void translate (double x)
12 {
13 x_ += x;
14 }
15 private:
16 double x_, y_;
17 }
Exemple c
1 void translate(struct Point *p, float x, float, y)
2 {
3 p->x += x;
4 p->y += y;
5 }
6
7 void translate(struct Point *p, float x)
8 {
9 p->x += x;
10 }
Il est possible de surcharger des méthode static
Choisir a compil time un methods en foncion de la signature
Context pas forcement orienté objet
c++ possibilité de surcahgrer des opérateurs ou fonction
Utilité de la surcharge
Faire des choses un peu différente (transaltion / transaltion horizontal)
Faire des choses différemment (init copier point / copier point avec cordoné)
Polymorphisme intraclasse (ah-doc)
Avantage dispatch static, désambigüisation à la compilation = perf
Certain n’aime pas les ambiguïtés
Type de polymorphisme dispo que sur les langage statiquement typé
H3 Masquage
Méthode homonyme distinguer par la classe à laquelle elle apartienne (polymorphisme
inter-classe)
Avantage dispatch static, désambigüisation à la compilation = perf
Le masquage introduit une ambiguité
Classe human avec méthode hello et sous-calsse employe avec une méthode hello .
1 auto h = Human{...}
2 [Link]();
3
4 auto e = Employ{...}
5 [Link]();
6
7 Human* incgnito = new Employ(...);
8 incognito->hello(); //Human
H2 Plymorphisme dynamique
H3 Ré-ecriture
Désambiguisation au run time (dispatch dynamique)
Polymorphisme intra-hiérarchique (d’inclusion pb inslusion derive)
Uilité même que surcahrge masquage
2 methode meme signature
Avantage : dipatch dynamique
Inconvenient cout de perf
Méthodes virtuelles -> methodes sujet au polymorphisme
1 class Human
2 {
3 public:
4 char[] name;
5 virtual void hello ()
6 {
7 printf("Hello my name is %s\n", name);
8 };
9 };
10
11 class Employee : public Human
12 {
13 public:
14 unsigned int salary;
15 void hello() override
16 {
17 printf("Hello my name is %s and i earn %d\n", name,
salary);
18 };
19 }
H3 Surcharge, masquage, Ré-écriture
propagation de la surcaharge intra-classe
depend des language
Depend de du caractère virtuel ou static des méthodes
Convertion des type
Masquage ré-écriture
Statique Dynamyque
Java -> methode static de même proto
C++ ->méthode static non virtuel
H3 Méthode abstraite
methodes abstraite qui n’a pas d’implémentation
c++ : methode abstraite x = 0 -> definition de classe abstraite = contient méthode
abstraite.
Lorsque que l’on dérive un classe contenant un méthode abstraite on est obliger de fournir
un implémentation (ré-ercrire) pour la méthodes abstraite => une classe contenant une
méthodes abstraite est forcement abstraite.
Exemple : Classe mere shape classe filles : triangle caréé etc…
On veut que tout les sous-classe de shape est un méthode scale .
On va déclarer un méthode abstraite scale dans la classe mere.
1 public abstract class Shape
2 {
3 public abstract void scale (double factor);
4 }
5
6 public class Circle extends Shape
7 {
8 @Override
9 public void scale (double factor)
10 {
11 radius *= factor;
12 };
13 private double radius;
14 }
H3 Interface Java
Possibilité d’héritage multiple
Tout est publique tout est abstract donc pas d’ambiguité tout est constantes
Une interface etend une ou plusieurs interface
Une classe implemente une ou plusiseurs interfaces
Possibilité de mettre des méthodes par défaut
Exemple
1 // Explicite qu'il faut une méthode `nurse` dans toutes les
sous-interfaces
2 public interface Nurse
3 {
4 public abstract void nurse ();
5 }
6 public interface Oviparous extends Nurse ()
7 {
8 default void nurse ()
9 {
10 println("Je couve mes oeufs.");
11 }
12 }
13 public interface Mammal extends Nurse
14 {
15 default void nurse()
16 {
17 println("J'alaite.");
18 }
19 }
20
21 public abstract class Animal
22 {
23 public int weight () { return wieght_; };
24 public abstract void cry () {};
25 private int weight_;
26 }
27
28 public class Bird extends Animal implements Oviparous
29 {
30 @Override
31 public void cry () { println("Tweet;"); };
32 }
33
34 public class Cat extends Animal implements Mammal
35 {
36 @Override
37 public void cry () { println("Miaou;"); };
38 }
39
40 public class Platypus extends Animal implements Oviparous,
Mammal
41 {
42 @Override
43 public void cry () { println("Platty!"); };
44
45 @Override
46 public void nurse ()
47 {
48 [Link] ();
49 [Link] ();
50 }
51 }
H2 Sous-classe VS sous-typage
H3 Probeleme
Sous classage fait pour heriter l’implementation mais hérite aussi de l’interface
Caracteristique sous typage -> traiter un humain sans savoir les détail de l’objet
Ambivalence Hértiage de l’implementaiotn => heritgage de l’interface
Si S<: T alors le type S peut etre manipuler en securiter dans les contrexte ou un type T
est attendu
Relation forte en Sous-classage et sous-typage
Covariance deux classe -> sous-classe (cast)
Quand le type de retours des méthodes est covariant par rapport aus sous-typage le
sous-calssage est encore valide
Driver : Car -> Truck Driver : Vehicule
sous-classe -> super-classe
contravariance
On ne peut plus manipuler les objet de type driver en toute securtié
Contravariance marche dans l’autre sens (pret vehicule)
Contravariance marche pas avec parking
50% des cas de figure impossible
Possbile covraicne type retour et contravarianve type d’entrer
Sous-classage recuperer comportment des super classe
sous typage dire que le comportment du super type reste valide dans sous type
Possbile covraicne type retour et contravarianve type d’entrer
Parfois impossible a cause du surchagre statique car proto different
donc drive sera toujours celle du truck
possible dans eiffel
Principe dynamique
H3 Principe de substitution de Liskov
appliquer au objet
Sous-typage comportemental fort
H4 Propriétés
Soit une propriété prouvable sur les objets x de type T
Alors, doit être vrai pour tout objet y de type S tel que S <: T.
Covariance des type de retours dans S
Contravariance de type des arguments dans S
Excepetion levées dans S doivent être des sous-type de celles levées dans T
(covariance)
Les invariants de T doivent être préservées dans S
Les pré-condition ne peuvent pas être renforcer dans S (contravariance)
Les post-condition ne peuvent pas être affaibli dans S (covariance)
Pré/post-condition condition de context avant/apres méthode (post -> rect caree)
Contrainte historique : la mutation n’a lieu qu’a travers l’interface. passer par les
accesseur Aucune methode de S ne doit permettre des mutation dans T (humain nom
contant)
Disipline de progrmation