La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal...

33
La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition de méthode(surcharge) Objets dynamiques Polymorphisme Méthodes virtuelles

Transcript of La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal...

Page 1: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

B. Illustration de la POO en Pascal

Définition d'objet ( encapsulation )

Héritage

Redéfinition de méthode(surcharge)

Objets dynamiques

Polymorphisme

Méthodes virtuelles

Page 2: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

• { ENCAPSULATION : Unité contenant une définition d'objet }

UNIT U0;

INTERFACE

Type Emplacement = Object

Abscisse : real;

Ordonnee : real;

Procedure Init(x, y : real);

Procedure Deplace(dx, dy : real);

Procedure Situe;

End;

Page 3: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

• IMPLEMENTATION

Procedure Emplacement.Init (x, y : real);

Begin abscisse := x ; Ordonnee := y ;

End;

Procedure Emplacement.Deplace( dx, dy : real );

Begin Abscisse := Abscisse + dx ; Ordonnee := Ordonnee + dy ;

End;

Procedure Emplacement.Situe;

Begin

Writeln('Coordonnées : ', abscisse : 5: 1, ' ', Ordonnee:5:1);

End;

END.

Page 4: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

• { HERITAGE :L'objet Point hérite de l'objet Emplacement. Il possède donc tous les champs et les méthodes de Emplacement. En plus, il possède le champ couleur et la méthode Colore }

Program P1;

Uses U0;

Type Point = Object ( Emplacement )

Couleur : byte;

Procedure Colore ( c : byte );

End;

Page 5: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

Procedure Point.Colore( c : byte );

Begin

couleur := c

End;

Var pt : point;

Begin

Pt.init (5, 3);

Pt.colore(10);

Pt.situe;

End.

Page 6: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

• { Héritage : redéfinition de méthode (SURCHARGE)

• On redéfinit dans l'objet Point la méthode Situe avec cette fois-ci deux paramètres.

• Si dans un arbre d'héritage, il y a plusieurs redéfinitions, le compilateur recherche la première définition dans le sens ascendant.

• Les affectations entre objets sont toujours dans le sens descendant. Les champs communs sont affectés

• Il ya deux façons de redéfinir la méthode Init :

• - avec appel à la méthode existante

• - sans appel }

Page 7: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

Program P2;

Uses U0;

Type Point = Object ( Emplacement )

Procedure Situe ( var x, y : real );

End;

Procedure Point.Situe( var x, y : real );

Begin

x := Abscisse; y := Ordonnee

End;

Page 8: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

Var pt : point; pos : emplacement; a, b : real; Begin Pos.init (5, 3); Pos.Situe; Pt.init(10,20); Pt.situe(a, b); Writeln('a = ', a:5:1, ' b = ', b:5:1) ; Pos := Pt; {affectation permise car sens descendant} Pos.situe; {Pt := Pos ;Non Permise, affectation toujours dans le sens

descendant } End.

Page 9: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

• {Héritage : objets dynamiques :

• Les objets peuvent être alloués dynamiquement.

• Après l'affectation Pos = Pt, Pos pointe un objet de type Point.

• Remarquez que le compilateur ne signale pas d'erreur. Mais remarquez aussi que, bien que Pos pointe un objet de type Point, Il n'est pas possible d'accèder au champ c. On ne peut non plus faire Pos^.init(3, 3, 12) par exemple. Ceci constitue un mauvais cas de polymorphisme

Page 10: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

Program P4;

Uses U0;

Type Point = Object ( Emplacement )

couleur : byte;

Procedure Init (x, y : Real; c : Byte );

End;

Procedure Point.Init( x,y : Real; c : byte );

Begin

Emplacement.Init (x, y) ;

{ equivalent à abscisse := x ; Ordonnee := y ;}

couleur := c;

End;

Page 11: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

Var pt : ^Point; pos : ^Emplacement; Begin New(pt); New(Pos); pt^.Init (2,5,10); pt^.situe; {2, 5} Pos^.init(3,3); Pos^.situe; {3, 3} Pos^:= Pt^; { Affectation entre deux objets } Pos^.situe; {2, 5} Pos := Pt; { Pos pointe un objet de type Point } { Writeln(' couleur = ', Pos^.c ); non accepté } { Pos^.init(3, 3, 12); non accepté } Pos^.init(3, 3); { accepté mais designe la méthode Init de Pos } END.

Page 12: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

• { POLYMORPHISME :

• { Introduction aux méthodes virtuelles : On ajoute à l'objet Emplacement la méthode Identifie ( qui permet d'identifier l'objet). Dans la méthode Situe, on ajoute un appel à Identifie. }

UNIT U1;

INTERFACE

Type Emplacement = Object

Abscisse : real;

Ordonnee : real;

Procedure Init(x, y : real);

Procedure Deplace(dx, dy : real);

Procedure Situe;

Procedure Identifie;

End;

Page 13: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

IMPLEMENTATION

Procedure Emplacement.Init (x, y : real);

Begin

abscisse := x ;

Ordonnee := y ;

End;

Procedure Emplacement.Deplace( dx, dy : real );

Begin

Abscisse := Abscisse + dx ;

Ordonnee := Ordonnee + dy ;

End;

Page 14: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

Procedure Emplacement.Situe;

Begin

Writeln('Coordonnées : ', abscisse : 5: 1, ' ', Ordonnee:5:1);

Identifie;

End;

Procedure Emplacement.Identifie;

Begin

Writeln(' Je suis un objet de type Emplacement ');

End;

END.

Page 15: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

• Ensuite, on redéfinit la méthode Identifie pour l'objet Point. Quand on appelle à la méthode situe de Pt, c'est le module Identifie de l'objet Pos qui s'exécute, d'où le message inattendu.

• Si l'on veut que Pt affiche son identité, il faut rendre la méthode Identifie "virtuelle" }

Page 16: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

Program P5; Uses U1; Type Point = Object ( Emplacement ) couleur : byte; Procedure colore(c : byte ); Procedure Identifie; End; Procedure Point.Colore( c : byte ); Begin couleur := c End; Procedure Point.Identifie; Begin Writeln(' Je suis un objet de type Point de couleur ', couleur ); End;

Page 17: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

Var pt : Point;

pos : Emplacement;

Begin

Pos.init(7, 7);

Pos.Situe; {affich de "objet de type emplac..}

pt.Init (2,5);

pt.situe; {affich de "objet de type emplac..}

END.

Page 18: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

• { POLYMORPHISME :

• { Méthodes Virtuelles : concepts

• Quand une méthode est déclarée "Virtuelle", son adresse n'est connue qu'au moment de l'éxécution.

• Tout objet contenant au moins une méthode virtuelle

• - doit posséder un Constructeur. ( Procédure spéciale)

• - possède un champ spécial (rajouté par le compilateur) destiné à recevoir à l'éxécution l'adresse de la TMV.

Page 19: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

• { POLYMORPHISME :• Au moment de la compilation :• 1. A tout objet contenant une méthode virtuelle, le compilateur associe

une TMV : table des méthodes virtuelles. La structure d'un élément peut être ( nom de la méthode, Adresse de son code)

• 2. Pour chaque appel à une méthode virtuelle, le compilateur génère la séquence suivante :

• - Récupérer l'adresse de la TMV de l'objet.• - Récupérer l'adresse de la méthode virtuelle• - Retrouver le code de la méthode et en faire l'appel.• On dit qu'il laisse l'appel à blanc. Puis au moment de l'éxécution il fait

ce qu'on appelle la ligature dynamique.

Page 20: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

• { POLYMORPHISME :

• Au moment de l'exécution :

• 1.Le constructeur range l'adresse de la TMV dans l'objet.

• Remarques :

• 1. Pour des contraintes de compilation, toutes les méthodes redéfinies déclarées virtuelles doivent avoir le même nombre de paramètres

• 2. Dans la plupart des cas, le Constructeur est la première procedure appelée. }

Page 21: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

UNIT U2; INTERFACE Type Emplacement = Object Abscisse : real; Ordonnee : real; CONSTRUCTOR Init(x, y : real); Procedure Deplace(dx, dy : real); Procedure Situe; Procedure Identifie ; VIRTUAL; End; IMPLEMENTATION CONSTRUCTOR Emplacement.Init (x, y : real); Begin abscisse := x ; Ordonnee := y ;End;

Page 22: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

Procedure Emplacement.Deplace( dx, dy : real );

Begin

Abscisse := Abscisse + dx ; Ordonnee := Ordonnee + dy ;

End;

Procedure Emplacement.Situe;

Begin

Writeln('Coordonnées : ', abscisse : 5: 1, ' ', Ordonnee:5:1);

Identifie; { le compilateur laisse l'appel à blanc }

End;

Procedure Emplacement.Identifie;

Begin Writeln(' Je suis un objet de type Emplacement ');End;

END.

Page 23: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

Program P6;

Uses U2;

Type Point = Object ( Emplacement )

couleur : byte;

Procedure colore(c : byte );

Procedure Identifie; VIRTUAL ;

End;

Procedure Point.Colore( c : byte );

Begin

couleur := c

End;

Page 24: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

Procedure Point.Identifie;

Begin

Writeln(' Je suis un objet de type Point de couleur ', couleur );

End;

Var pt : Point;

pos : Emplacement;

Begin

Pos.init(7, 7);

Pos.Situe;

pt.Init (2,5);

pt.situe; { affichage avec bonne identification }

END.

Page 25: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

• { POLYMORPHISME : même chose avec objets dynamiques } Program P7; Uses U2; Type Point = Object ( Emplacement ) couleur : byte; Procedure colore(c : byte ); Procedure Identifie; virtual; End; Procedure Point.Colore( c : byte ); Begin couleur := c End; Procedure Point.Identifie; Begin Writeln(' Je suis un objet de type Point de couleur ', couleur ); End;

Page 26: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

Var pt : ^Point; pos : ^Emplacement; Begin writeln('Debut'); New(Pos); New(Pt); Pos^.init(7, 7); { range l'adresse de la TMV dans Pos^ } Pos^.Situe; pt^.Init (2,5); pt^.situe; Pos := Pt; {Pos pointe maintenant un objet de type Point } Pos^.situe; { fait bien référence à un objet de type Point (avec bon affichage), ce

qui n'etait pas possible avant } Writeln('Fin'); END.

Page 27: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

• { POLYMORPHISME : Construction d'une liste d'adresses d'objets de types différents mais héritant d'un même ancêtre. Puis affichage de l'identité de chaque objet de cette liste. }

UNIT U3; INTERFACE Type Emplacement = Object

Abscisse : real; Ordonnee : real; Constructor Init(x, y : real); Procedure Deplace(dx, dy : real); Procedure Situe;

Procedure Identifie; Virtual ; End;

Page 28: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

Type Point = Object ( Emplacement )

couleur : byte;

Procedure colore(c : byte );

Procedure Identifie; virtual;

End;

Type Carre = Object ( Point )

Procedure identifie; Virtual ;

End;

IMPLEMENTATION

Constructor Emplacement.Init (x, y : real);

Begin abscisse := x ; Ordonnee := y ; End;

Page 29: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

Procedure Emplacement.Deplace( dx, dy : real );

Begin

Abscisse := Abscisse + dx ;

Ordonnee := Ordonnee + dy ;

End;

Procedure Emplacement.Situe;

Begin

Writeln('Coordonnées : ', abscisse : 5: 1, ' ', Ordonnee:5:1);

Identifie;

End;

Procedure Emplacement.Identifie;

Begin Writeln(' Je suis un objet de type Emplacement '); End;

Page 30: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

Procedure Point.Colore( c : byte ); Begin couleur := c End; Procedure Point.Identifie; Begin Writeln(' Je suis un objet de type Point de couleur ', couleur ); End; Procedure Carre.Identifie; Begin Writeln('Je suis un objet de type Carre'); End; END.

Page 31: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

Program P8;

Uses U3;

Type t = ^tmaillon;

tmaillon = record

adrobjt : ^Emplacement;

suiv : t ;

End ;

Var pt : ^Point;

pos, ptr : ^Emplacement;

car : ^Carre ;

Liste, L1, L2 : t;

Page 32: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

Procedure Afficher (TeteListe : t);

Var

p : t;

Begin

p := TeteListe ;

While ( P <> Nil ) do

Begin

ptr := P^.adrobjt ; { p^.adrobjt^.identifie }

ptr^.identifie;

p := p^.suiv

End;

End;

Page 33: La programmation objet Illustration de la POO en Pascal B. Illustration de la POO en Pascal Définition d'objet ( encapsulation ) Héritage Redéfinition.

La programmation objetIllustration de la POO en Pascal

Begin writeln('Debut'); New(Pos); New(Pt); New(Car); Pos^.init(7, 7); New(Liste); Liste^.adrobjt := Pos; L1 := Liste; pt^.Init (2,5); New(L2); L2^.adrobjt := Pt; L1^.suiv := L2; L1 := L2; Car^.init(8, 8); New(L2); L2^.adrobjt := Car; L1^.suiv := L2; L2^.suiv := Nil; Afficher(Liste); Writeln('Fin'); END.