Notation objet préfixée en Ada 20 05.

Pascal <[email protected]>
Newsgroups gmane.comp.lang.ada.france
Message-ID <[email protected]>
Bonjour, en utilisant la notation objet préfixée en Ada 2005 avec  
GNAT GPL 2007 sur Mac OS X, j'arrive à différents comportements.

a) Notation "Ada 95" :

    package Figure is
       type Coordonnee is range -100 .. 100;
       type Instance is abstract tagged private;
       subtype Class is Instance'Class;
       procedure Positionne (Objet : in out Instance; X, Y :  
Coordonnee);
       function RetourneX (Objet : in Instance) return Coordonnee;
       function RetourneY (Objet : in Instance) return Coordonnee;
       procedure Allume (Objet : in Instance) is abstract;
       procedure Eteins (Objet : in Instance) is abstract;
       procedure Affiche (Objet : in Class; EstVisible : Boolean);
       procedure Deplace (Objet : in out Class; DX, DY : Coordonnee);
    private
       type Instance is abstract tagged record
          X, Y : Coordonnee := 0;
       end record;
    end Figure;

    package body Figure is
       procedure Positionne (Objet : in out Instance; X, Y :  
Coordonnee) is
       begin
          Objet.X := X;
          Objet.Y := Y;
       end Positionne;
       function RetourneX (Objet : in Instance) return Coordonnee is
       begin
          return Objet.X;
       end RetourneX;
       function RetourneY (Objet : in Instance) return Coordonnee is
       begin
          return Objet.Y;
       end RetourneY;
       procedure Affiche (Objet : in Class; EstVisible : Boolean) is
       begin
          if EstVisible then
             Allume (Objet);
          else
             Eteins (Objet);
          end if;
       end Affiche;
       procedure Deplace (Objet : in out Class; DX, DY : Coordonnee) is
       begin
          Affiche (Objet, False);
          Positionne (Objet, Objet.X + DX, Objet.Y + DY);
          Affiche (Objet, True);
       end Deplace;
    end Figure;

Pas d'erreur, notez l'utilisation du sous-type Class.

b) Notation Ada 2005 :

    package Figure is
       type Coordonnee is range -100 .. 100;
       type Instance is abstract tagged private;
       subtype Class is Instance'Class;
       procedure Positionne (Objet : in out Instance; X, Y :  
Coordonnee);
       function RetourneX (Objet : in Instance) return Coordonnee;
       function RetourneY (Objet : in Instance) return Coordonnee;
       procedure Allume (Objet : in Instance) is abstract;
       procedure Eteins (Objet : in Instance) is abstract;
       procedure Affiche (Objet : in Class; EstVisible : Boolean);
       procedure Deplace (Objet : in out Class; DX, DY : Coordonnee);
    private
       type Instance is abstract tagged record
          X, Y : Coordonnee := 0;
       end record;
    end Figure;

    package body Figure is
       procedure Positionne (Objet : in out Instance; X, Y :  
Coordonnee) is
       begin
          Objet.X := X;
          Objet.Y := Y;
       end Positionne;
       function RetourneX (Objet : in Instance) return Coordonnee is
       begin
          return Objet.X;
       end RetourneX;
       function RetourneY (Objet : in Instance) return Coordonnee is
       begin
          return Objet.Y;
       end RetourneY;
       procedure Affiche (Objet : in Class; EstVisible : Boolean) is
       begin
          if EstVisible then
             Objet.Allume;
          else
             Objet.Eteins;
          end if;
       end Affiche;
       procedure Deplace (Objet : in out Class; DX, DY : Coordonnee) is
       begin
          Objet.Affiche (False);  -- erreur
          Objet.Positionne (Objet.X + DX, Objet.Y + DY);
          Objet.Affiche (True);   -- erreur
       end Deplace;
    end Figure;

J'obtiens avec le sous-type Class les erreurs :
figures_abstraites2005.adb:49:15: no selector "Affiche" for type  
"Instance'Class" defined at line 6
figures_abstraites2005.adb:53:15: no selector "Affiche" for type  
"Instance'Class" defined at line 6

c) Source modifié sans l'emploi du sous-type Class :

    package Figure is
       type Coordonnee is range -100 .. 100;
       type Instance is abstract tagged private;
       subtype Class is Instance'Class;
       procedure Positionne (Objet : in out Instance; X, Y :  
Coordonnee);
       function RetourneX (Objet : in Instance) return Coordonnee;
       function RetourneY (Objet : in Instance) return Coordonnee;
       procedure Allume (Objet : in Instance) is abstract;
       procedure Eteins (Objet : in Instance) is abstract;
       procedure Affiche (Objet : in Instance'Class; EstVisible :  
Boolean);
       procedure Deplace (Objet : in out Instance'Class; DX, DY :  
Coordonnee);
    private
       type Instance is abstract tagged record
          X, Y : Coordonnee := 0;
       end record;
    end Figure;

    package body Figure is
       procedure Positionne (Objet : in out Instance; X, Y :  
Coordonnee) is
       begin
          Objet.X := X;
          Objet.Y := Y;
       end Positionne;
       function RetourneX (Objet : in Instance) return Coordonnee is
       begin
          return Objet.X;
       end RetourneX;
       function RetourneY (Objet : in Instance) return Coordonnee is
       begin
          return Objet.Y;
       end RetourneY;
       procedure Affiche (Objet : in Instance'Class; EstVisible :  
Boolean) is
       begin
          if EstVisible then
             Objet.Allume;
          else
             Objet.Eteins;
          end if;
       end Affiche;
       procedure Deplace (Objet : in out Instance'Class; DX, DY :  
Coordonnee) is
       begin
          Objet.Affiche (False);
          Objet.Positionne (Objet.X + DX, Objet.Y + DY);
          Objet.Affiche (True);
       end Deplace;
    end Figure;

Plus d'erreur !?

Quel est ce mystère ?
Existe-t-il une règle Ada 2005 empêchant l'emploi des sous-types pour  
la notation objet préfixée ?
Un restriction de GNAT ?

Merci pour vos réponses, Pascal.
http://blady.perso.orange.fr



_______________________________________________
Site WWW de l'association Ada-France: http://www.ada-france.org/
[email protected]
http://www.ada-france.org/mailman/listinfo/ada-france
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.