Bon, en fait je me relis et je ne me comprends pas, c'est mauvais signe :)
Le bout de code Mal correspond à un code où l'on désire explicitement que s soit accessible en tant qu'array et que stack sous la forme d'une arrayed_stack. Avec le bout de code Bien, on montre explicitement que l'on désire que s soit une pile, accessoirement une pile gérée dans un tableau _mais_ c'est un détail qui ne doit pas transparaitre à l'extérieur.
En fait, c'est au programmeur de savoir ce qu'il veut.
Pour limiter la remontée dans l'arbre d'héritage il faut fixer le type de la variable, c'est tout. À moins de tricher (ce qui n'est pas toujours possible) il n'est pas possible de remonter l'arbre comme ça.
Pour se protéger encore plus, il faut passer par un intermédiaire, c'est tout (pattern proxy).
Bon, sinon je ne vois pas pourquoi foutre un ARRAY_STACK[G] dans un COLLECTION[ARRAY[G]] mettrais le souk ?
s : ARRAYED_STACK[G]
a : ARRAY[G]
c : COLLECTION[ARRAY[G]]
--
a := s
c.put(a)
--
Et donc
c.item est de type ARRAY[G]
s est de type ARRAYED_STACK[G]
Où est le problème ? En posant le type de s à ARRAYED_STACK, on demande explicitement à ce que la pile soit accessible des deux manières, c'est ainsi. En modifiant c on modifie la structure de la pile s, et alors ? C'est voulu dans le code ! Normalement, c devra quand même respecter les assertions (l'invariant notamment) de s donc en théorie il ne devrait même pas y avoir de casse ...
Bon, il faut absolument que je déterre un compilo eiffel pour vérifier ... grmbl.
[^] # Re: Si j'ai bien tout compris
Posté par Jean-Yves B. . En réponse au journal Si j'ai bien tout compris. Évalué à 1.
Le bout de code Mal correspond à un code où l'on désire explicitement que s soit accessible en tant qu'array et que stack sous la forme d'une arrayed_stack. Avec le bout de code Bien, on montre explicitement que l'on désire que s soit une pile, accessoirement une pile gérée dans un tableau _mais_ c'est un détail qui ne doit pas transparaitre à l'extérieur.
En fait, c'est au programmeur de savoir ce qu'il veut.
Pour limiter la remontée dans l'arbre d'héritage il faut fixer le type de la variable, c'est tout. À moins de tricher (ce qui n'est pas toujours possible) il n'est pas possible de remonter l'arbre comme ça.
Pour se protéger encore plus, il faut passer par un intermédiaire, c'est tout (pattern proxy).
Bon, sinon je ne vois pas pourquoi foutre un ARRAY_STACK[G] dans un COLLECTION[ARRAY[G]] mettrais le souk ?
s : ARRAYED_STACK[G]
a : ARRAY[G]
c : COLLECTION[ARRAY[G]]
--
a := s
c.put(a)
--
Et donc
c.item est de type ARRAY[G]
s est de type ARRAYED_STACK[G]
Où est le problème ? En posant le type de s à ARRAYED_STACK, on demande explicitement à ce que la pile soit accessible des deux manières, c'est ainsi. En modifiant c on modifie la structure de la pile s, et alors ? C'est voulu dans le code ! Normalement, c devra quand même respecter les assertions (l'invariant notamment) de s donc en théorie il ne devrait même pas y avoir de casse ...
Bon, il faut absolument que je déterre un compilo eiffel pour vérifier ... grmbl.