0% ont trouvé ce document utile (0 vote)
30 vues8 pages

Mob1 03

Le document traite du polymorphisme en programmation, en distinguant le polymorphisme statique et dynamique. Il aborde des concepts tels que la surcharge, le masquage, la réécriture, les méthodes abstraites et les interfaces en Java, ainsi que les implications du sous-classement et du sous-typage. Le principe de substitution de Liskov est également discuté, soulignant l'importance de respecter les invariants et les conditions pré/post dans les relations de sous-typage.

Transféré par

lucasastiegog
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
30 vues8 pages

Mob1 03

Le document traite du polymorphisme en programmation, en distinguant le polymorphisme statique et dynamique. Il aborde des concepts tels que la surcharge, le masquage, la réécriture, les méthodes abstraites et les interfaces en Java, ainsi que les implications du sous-classement et du sous-typage. Le principe de substitution de Liskov est également discuté, soulignant l'importance de respecter les invariants et les conditions pré/post dans les relations de sous-typage.

Transféré par

lucasastiegog
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

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

Vous aimerez peut-être aussi