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