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

programmation objet

Embed Size (px)

DESCRIPTION

programmation objet

Citation preview

  • La programmation objetIllustration de la POO en Pascal

    B. Illustration de la POO en Pascal Dfinition d'objet ( encapsulation ) Hritage Redfinition de mthode(surcharge) Objets dynamiques Polymorphisme Mthodes virtuelles

  • La programmation objetIllustration de la POO en Pascal

    { ENCAPSULATION : Unit contenant une dfinition 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;

  • 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('Coordonnes : ', abscisse : 5: 1, ' ', Ordonnee:5:1); End; END.

  • La programmation objetIllustration de la POO en Pascal

    { HERITAGE :L'objet Point hrite de l'objet Emplacement. Il possde donc tous les champs et les mthodes de Emplacement. En plus, il possde le champ couleur et la mthode Colore }

    Program P1; Uses U0; Type Point = Object ( Emplacement ) Couleur : byte; Procedure Colore ( c : byte ); End;

  • 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.

  • La programmation objetIllustration de la POO en Pascal

    { Hritage : redfinition de mthode (SURCHARGE) On redfinit dans l'objet Point la mthode Situe avec cette fois-ci

    deux paramtres. Si dans un arbre d'hritage, il y a plusieurs redfinitions, le

    compilateur recherche la premire dfinition dans le sens ascendant.

    Les affectations entre objets sont toujours dans le sens descendant. Les champs communs sont affects

    Il ya deux faons de redfinir la mthode Init : - avec appel la mthode existante - sans appel }

  • 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;

  • 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.

  • La programmation objetIllustration de la POO en Pascal

    {Hritage : objets dynamiques : Les objets peuvent tre allous dynamiquement.

    Aprs 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'accder au champ c. On ne peut non plus faire Pos^.init(3, 3, 12) par exemple. Ceci constitue un mauvais cas de polymorphisme

  • 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;

  • 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 mthode Init de Pos } END.

  • La programmation objetIllustration de la POO en Pascal

    { POLYMORPHISME : { Introduction aux mthodes virtuelles : On ajoute l'objet

    Emplacement la mthode Identifie ( qui permet d'identifier l'objet). Dans la mthode 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;

  • 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;

  • La programmation objetIllustration de la POO en Pascal

    Procedure Emplacement.Situe; Begin Writeln('Coordonnes : ', abscisse : 5: 1, ' ', Ordonnee:5:1); Identifie; End; Procedure Emplacement.Identifie; Begin Writeln(' Je suis un objet de type Emplacement '); End; END.

  • La programmation objetIllustration de la POO en Pascal

    Ensuite, on redfinit la mthode Identifie pour l'objet Point. Quand on appelle la mthode situe de Pt, c'est le module Identifie de l'objet Pos qui s'excute, d'o le message inattendu.

    Si l'on veut que Pt affiche son identit, il faut rendre la mthode Identifie "virtuelle" }

  • 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;

  • 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.

  • La programmation objetIllustration de la POO en Pascal

    { POLYMORPHISME : { Mthodes Virtuelles : concepts Quand une mthode est dclare "Virtuelle", son adresse n'est

    connue qu'au moment de l'xcution.

    Tout objet contenant au moins une mthode virtuelle - doit possder un Constructeur. ( Procdure spciale) - possde un champ spcial (rajout par le compilateur)

    destin recevoir l'xcution l'adresse de la TMV.

  • La programmation objetIllustration de la POO en Pascal

    { POLYMORPHISME : Au moment de la compilation : 1. A tout objet contenant une mthode virtuelle, le compilateur

    associe une TMV : table des mthodes virtuelles. La structure d'un lment peut tre ( nom de la mthode, Adresse de son code)

    2. Pour chaque appel une mthode virtuelle, le compilateur gnre la squence suivante :

    - Rcuprer l'adresse de la TMV de l'objet. - Rcuprer l'adresse de la mthode virtuelle - Retrouver le code de la mthode et en faire l'appel. On dit qu'il laisse l'appel blanc. Puis au moment de l'xcution il

    fait ce qu'on appelle la ligature dynamique.

  • La programmation objetIllustration de la POO en Pascal

    { POLYMORPHISME : Au moment de l'excution : 1.Le constructeur range l'adresse de la TMV dans l'objet. Remarques : 1. Pour des contraintes de compilation, toutes les mthodes

    redfinies dclares virtuelles doivent avoir le mme nombre de paramtres

    2. Dans la plupart des cas, le Constructeur est la premireprocedure appele. }

  • 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;

  • 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('Coordonnes : ', 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.

  • 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;

  • 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.

  • La programmation objetIllustration de la POO en Pascal

    { POLYMORPHISME : mme 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;

  • 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 rfrence un objet de type Point (avec bon

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

  • La programmation objetIllustration de la POO en Pascal

    { POLYMORPHISME : Construction d'une liste d'adresses d'objets de types diffrents mais hritant d'un mme anctre. 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;

  • 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;

  • 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('Coordonnes : ', abscisse : 5: 1, ' ', Ordonnee:5:1); Identifie; End; Procedure Emplacement.Identifie; Begin Writeln(' Je suis un objet de type Emplacement '); End;

  • 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.

  • 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;

  • 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;

  • 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.