|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Nouveau Membre du Club
![]() Enseignant Inscription : avril 2012 Messages : 26 ![]() |
Bonjour, je me pense ces derniers sur les types tagged. Et je me posais une question : est-il possible avec l'attribut 'class ou un pointeur sur classe, de disposer d'un objet dont le type pourrait varier ? Exemple, j'ai les classes et méthodes suivantes :
Code :
Code :
Merci d'avance. |
||||
|
|
10
|
|
|
#2 |
|
Membre confirmé
![]() |
Normalement (parce que j'ai pas vérifié et que je maîtrise pas bien tout ça), ça marche mais il va falloir utiliser un accès sur un objet de classe Voiture pour déclarer Ma_Voiture car les objets de classe sont indéfinis.
Pour plus d'info, regardes le wikibook qui va bien. |
|
00
|
|
|
#3 |
|
Nouveau Membre du Club
![]() Inscription : octobre 2010 Messages : 21 ![]() |
Bonjour,
Dans le rationale d'ada 2005 écrit par John Barnes, ce dernier précise bien que l'écriture préfixée n'est "que" du sucre syntaxique pour ne pas passer par l'arborescence des paquetages (la notation préfixée n'étant d'ailleurs utilisable que si le paquetage est "use"). Cette méthode ne permet donc pas de faire de l'aiguillage dynamique à l'exécution, même si ça le feint relativement bien car le codeur n'a pas à changer le code s'il change le type de la variable, tant que les méthodes appelées sont définies à ce niveau de l'héritage. L'aiguillage dynamique ne se fait que via l'appel de méthodes contenant une variable de type Type'class. L'attribut class décrivant l'appartenance à l'arborescence descendante du type attributaire, il est cette fois impossible de savoir quelle(s) méthode(s) on va appeler sur quel type précis, donc plus de notation préfixée. Il est important de noter que seuls des appels à des méthodes d'instances au sein d'une méthode de classe sont aiguillés, il n'y a pas d'aiguillage sur la méthode de classe elle-même vu qu'elle est en exemplaire unique. EDIT : il semblerait que j'ai cliqué sur envoyer plutôt que visualiser... En espérant que mes explications sont claires donc. |
|
|
00
|
|
|
#4 | |||
|
Membre confirmé
![]() |
Jaizu, le passage que tu cites :
Citation:
L'usage d'un paramètre de la forme Type'Class pour une procédure ne se justifie que lorsque l'on veut faire une procédure s'appliquant à l'ensemble des objets d'un même arbre d'héritage. Ainsi, voici un code simpliste (à scinder en morceaux avec gnatchop) pour illustrer la question de Sigurd9. Il n'y a pas de paramètre de classe mais seulement une variable initialisée comme telle. Code :
Par contre, j'ai re-découvert que je devais surcharger init_voiture dans le paquetage Limo. Merci le compilo. Par contre, encore une fois si une méthode devait utiliser la fonction Rouler sans connaître le type exact à lui passer, il faudrait que cette fonction prenne un paramètre de la forme Voiture'Class pour pouvoir s'appliquer à tous les objets se trouvant dans l'arbre d'héritage de Voiture. |
|||
|
00
|
|
|
#5 |
|
Nouveau Membre du Club
![]() Enseignant Inscription : avril 2012 Messages : 26 ![]() |
Donc si j'ai bien compris, écrire "MaVoiture : T_Voiture'class" n'a d'intérêt que pour mes méthodes (afin qu'elles s'appliquent à l'intégralité de la classe, sans les soucis liés à l'héritage). Lorsque j'écris mon programme principal, MaVoiture peut-être déclarée de type T_Voiture'class mais doit nécessairement être initialisée ce qui impose qu'elle soit dès le départ de type T_Voiture ou T_Limousine.
Et si j'utilise un pointeur sur classe, je devrai préciser l'origine de la méthode. |
|
|
10
|
|
|
#6 | |||||
|
Membre confirmé
![]() |
Citation:
Ce que je voulais dire, c'est que si tu décides de faire une fonction ou une procédure qui s'applique à tout type de voiture, tu devras alors le préciser dans sa signature afin de faire l'aiguillage dynamique. Par exemple, je veux tester un ensemble de voitures et donc je dois les faire rouler, je devrais écrire quelque chose comme : Code :
Après pour ce qui est de ton pointeur, cela te permettra de retarder l'instanciation de ton objet et donc de de le faire en fonction du retour de l'entrée utilisateur. Il n'y a donc pas de problème D'ailleurs, j'ai fait un petit bout de code à l'arrache (en clair, y a certainement une autre solution plus propre) : Code :
|
|||||
|
00
|
|
|
#7 | ||
|
Nouveau Membre du Club
![]() Inscription : octobre 2010 Messages : 21 ![]() |
@Blackknight : Oh, en effet, quelle bourde !
J'ajouterai cependant une précision : la déclaration d'un Type'class (sans pointeur bien entendu) est semblable à un "tampon de type" qui est contraint à "tout ce qu'il y a entre le type racine et le type de l'initialisation". Si on déclare une Voiture'class comme étant une Limousine (via init_Limousine), on peut par la suite changer et la considérer comme une voiture (avec un Init_Voiture par exemple), puis à nouveau comme une Limousine. Ce n'est bien sûr conseillé que lorsqu'on est sûr d'où on met les pieds et il vaut mieux passer par un pointeur pour le typage. Sinon, une idée pour avoir une voiture du type qu'on souhaite : Code Ada :
Qui se révèle par contre dangereux utilisé ailleurs qu'à l'initialisation (TAG_ERROR si la contrainte sur le type est violée). |
||
|
|
00
|
|
|
#8 |
|
Nouveau Membre du Club
![]() Enseignant Inscription : avril 2012 Messages : 26 ![]() |
Merci à tous les deux,
j'ai les idées plus claires maintenant sur ce que je peux (et dois) faire. |
|
|
10
|
Copyright © 2000-2013 - www.developpez.com