silvyan a écrit :
J'ai cru voir des programmeurs ada, alors bonjour a eux.
Je tiens à vous soumettre ce problème de typage.
Je souhaite faire une structure de type hétérogène.
je pense alors a de l'objet, avec polymorphisme et aiguillage dynamique, mais ca ne marche pas...
[...]
|
Bonjour Silvyan,
Aprés examen de ton source, il apparait que le dispatching ne peut pas fonctionner directement sous la forme où tu l'as tenté, car les primitives (les opérations qui peuvent être redéfinies et donc dispatchées), ne peuvent apparaitrent que dans une spécification de package.
Dans ton exemple, les déclarations apparaissent comme des déclarations locales d'une procédure.
Il est en effet souvent tentant de faire des teste dans les déclarations locales d'une procédure, car c'est plus rapide, mais ça ne fonctionne pas toujours, car Ada n'autorise pas tout dans ce contexte.
Pour faire fonctionner ton exemple, il est tout de même possible de déclarer un package localement (pour ce cas précis, ça marche).
De plus, tu as déclaré tes procédure “ test ”, au mauvais endroit. Pour qu'elle soit interprétée comme une primitive, la déclaration d'une opération ou d'une fonction, doit apparaître immédiatement aprés la déclaration du type.
Voici un exemple reformulé, qui reprend autant que possible tes propres termes :
(le forum modifie un peu la mise en forme, désolé pour ça)
Code :
- -- Exemple Ada 2005
- procedure Essais is
- -- Pour http://forum.hardware.fr/hfr/Programmation/ADA/
- -- class-access-erreur-sujet_18288_1.htm
- -- ========================================================================
- -- Specifications de Dispatching
- -- ------------------------------------------------------------------------
-
- package Dispatching is
- type Obj1 is tagged null record;
- -- 1er obj vide
- procedure Test (T : in Obj1);
- -- Primitive de Obj1
- type Obj2 is new Obj1 with null record;
- -- 2nd obj vide
- overriding procedure Test (T : in Obj2);
- -- Redefinition de la primitive.
- -- Le mot clé "overriding" n'est pas obligatoire, mais il rend
- -- le source plus claire.
- end Dispatching;
- -- ========================================================================
- -- Implementation de Dispatching
- -- ------------------------------------------------------------------------
-
- package body Dispatching is
-
- procedure Test (T : in Obj1) is
- begin
- null;
- end Test;
- procedure test (T : in Obj2) is
- begin
- null;
- end Test;
-
- end Dispatching;
- -- ========================================================================
- -- Type et objet pour l'essai
- -- ------------------------------------------------------------------------
-
- type Ptr is access Dispatching.Obj1'Class;
- --pointeur sur la classe obj1 et donc sur obj1 et obj2
- procedure Test_Tag (T : in Ptr) is
- begin
- Dispatching.Test (T.all);
- end Test_Tag;
- Obj : constant Ptr := new Dispatching.Obj1;
- -- ========================================================================
- -- Point d'entré du programme
- -- ------------------------------------------------------------------------
-
- begin
-
- Test_Tag (Obj);
-
- end Essais;
|