Blady
2018-11-22 20:59:09 UTC
Bonjour,
Voici un exemple inspiré de celui donné au chapitre 14.5 du livre
"Programming in Ada 2012":
1. procedure Programming_Ada_2012 is
2.
3. type O1 is tagged record
4. X : Float := 0.0;
5. Y : Float := 0.0;
6. end record;
7.
8. procedure Swap (X, Y : in out O1) is
9. T : O1 := X;
10. begin
11. X := Y;
12. Y := T;
13. end Swap;
14.
15. procedure Swap (X, Y : in out O1'Class) is
16. T : O1'Class := X;
17. begin
18. X := Y;
19. Y := T;
20. end Swap;
21.
22. type C1 is new O1 with record
23. R : Float;
24. end record;
25.
26. -- procedure Swap (X, Y : in out C1) is
27. -- T : O1 := O1 (X);
28. -- begin
29. -- O1 (X) := O1 (Y);
30. -- O1 (Y) := T;
31. -- end Swap;
32.
33. S, R : O1;
34. U, V : C1;
35.
36. begin
37. Swap (S, R);
38. Swap (U, V);
39. end Programming_Ada_2012;
Ma question est que comme la primitive Swap (l8) du type O1 est
surchargée par la procédure de classe Swap (l15), que devient la
primitive héritée Swap du type C1 ?
Elle devrait exister telle que celle mise en commentaires (l26).
Pourtant, GNAT donne une erreur pour l'appel Swap (l37) avec des
instances du type O1 mais pas pour l'appel Swap (l38) avec des instances
du type C1 (hérité de O1) :
programming_ada_2012.adb:37:04: ambiguous expression (cannot resolve "Swap")
Comme expliqué par John Barnes, la primitive héritée pour le type C1 n'a
que peu d'utilité car elle ne va échanger que les champs X et Y et non
pas R, mais est-ce qu'elle n'existe alors pas pour le langage ?
Merci pour vos idées, Pascal.
Voici un exemple inspiré de celui donné au chapitre 14.5 du livre
"Programming in Ada 2012":
1. procedure Programming_Ada_2012 is
2.
3. type O1 is tagged record
4. X : Float := 0.0;
5. Y : Float := 0.0;
6. end record;
7.
8. procedure Swap (X, Y : in out O1) is
9. T : O1 := X;
10. begin
11. X := Y;
12. Y := T;
13. end Swap;
14.
15. procedure Swap (X, Y : in out O1'Class) is
16. T : O1'Class := X;
17. begin
18. X := Y;
19. Y := T;
20. end Swap;
21.
22. type C1 is new O1 with record
23. R : Float;
24. end record;
25.
26. -- procedure Swap (X, Y : in out C1) is
27. -- T : O1 := O1 (X);
28. -- begin
29. -- O1 (X) := O1 (Y);
30. -- O1 (Y) := T;
31. -- end Swap;
32.
33. S, R : O1;
34. U, V : C1;
35.
36. begin
37. Swap (S, R);
38. Swap (U, V);
39. end Programming_Ada_2012;
Ma question est que comme la primitive Swap (l8) du type O1 est
surchargée par la procédure de classe Swap (l15), que devient la
primitive héritée Swap du type C1 ?
Elle devrait exister telle que celle mise en commentaires (l26).
Pourtant, GNAT donne une erreur pour l'appel Swap (l37) avec des
instances du type O1 mais pas pour l'appel Swap (l38) avec des instances
du type C1 (hérité de O1) :
programming_ada_2012.adb:37:04: ambiguous expression (cannot resolve "Swap")
Comme expliqué par John Barnes, la primitive héritée pour le type C1 n'a
que peu d'utilité car elle ne va échanger que les champs X et Y et non
pas R, mais est-ce qu'elle n'existe alors pas pour le langage ?
Merci pour vos idées, Pascal.