ça marche (et heureusement !)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 O est un MaClasseMere dynamique O = allouer MaClasseFille()
ça marche (et heureusement !)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 O est un MaClasseMere dynamique O = allouer MaClasseFille()
Comment pourrais-tu accéder à aux membres de MaClasseFille si tu manipules ton instance via une référence de MaClasseMere ?
Ce n'est évidemment pas possible directement, et heureusement !
Mais tu peux le faire indirectement, cela dit, soit via l'indirection, soit en recastant ta variable en MaClasseFille quand tu le souhaites.
Je ne comprends pas le problème : pour le coup ce comportement de Windev est parfaitement normal, cela marche exactement de la même façon dans les langages objets "sérieux".
Pas du tout je te confirme que en C# et Java tu peux accéder aux membres de MaClasseFille même si tu as typé l'objet comme un objet de MaClasseMère, c'est ça le DownCasting transtyper la classe mère en fille et avoir accès au méthode et membre de celle-ci. Ce besoin est très récurrent quand on utilise beaucoup l’héritage en POO.
Je pense qu'on a un pb de communication
Ce que tu dis, tel que je le comprends, ne marche pas en C# :
Pour que ça marche, il faut transtyper explicitement, comme je le précisais dans mon message :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 MaClasseMere a = new MaClasseFille(); a.PropMere = "FOO"; // ok a.PropFille= "FOO"; // ko
Mais ceci est possible aussi en Windev, quoique de manière un peu plus pénible.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 MaClasseMere a = new MaClasseFille(); a.PropMere = "FOO"; // ok ((MaClasseFille)a).PropFille= "FOO"; // OK là ça marche
Conclusion : le downcasting est donc bien possible.
Comment tu reproduits ça en windev
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 MaClasseMere a = new MaClasseFille(); a.PropMere = "FOO"; // ok ((MaClasseFille)a).PropFille= "FOO"; // OK là ça marche
Facile.
Option 1 : en transtypant (Plus verbeux qu'en C# à cause de l'impossibilité de transtyper directement (à ma connaissance) mais ça marche très bien)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 a est un MaClasseMere dynamique = allouer MaClasseFille() a.PropMere = "FOO"; // ok b est un MaClasseFille dynamique = a b.PropFille= "FOO"; // ça marche aussi
Option 2 : avec l'indirection c'est encore plus simple même si je ne suis pas super fan dans ce cas de figure :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 a est un MaClasseMere dynamique = allouer MaClasseFille() a.PropMere = "FOO"; // ok {"a.PropFille"} = "FOO"; // ça marche aussi
Alors là moi je ne comprends trop grand chose:
Comment
peut fonctionner et pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part {"a.PropFille"} = "FOO";
????
Code : Sélectionner tout - Visualiser dans une fenêtre à part a.PropFille = "FOO";
Philippe,
N'hésitez à lever le pouce si mon aide vous a été utile.
C'est totalement aberrant que l'indirection marche et que l'utilisation direct de la prop génère une erreur. Alors la BIG GG Windev j'aurai tout vu
ça revient à ce que je disais. ça ne marche pas et ce que tu proposes c'est du bricolage pour imiter une fonctionnalité native à la POO que windev ne propose pas.
Mon interprétation :
Dans le premier cas, on utilise l'indirection, donc le code est évalué dynamiquement lors de l'exécution.
Ici, l'objet référencé par a est une instance de MaClasseFille, donc il dispose bien de la propriété PropFille.
Dans le second cas, Windev tente de tout "résoudre" lors de la compilation, selon ce qu'il sait.
Ici, il sait que a a été déclaré en tant que MaClasseMere. Peu importe qu'en fait ce soit MaClasseFille qui ait été instanciée, il se base sur la déclaration de a, et en déduit donc (à tort, mais on ne peut pas le blâmer et pour le coup ce n'est pas un défaut de Windev) que PropFille n'existe pas.
A ma connaissance, c'est exactement pareil en C# ou en java, à moins de transtyper effectivement a en MaClasseFille, c'est à dire de "forcer la main" du compilateur.
Mais là on est vraiment sur des problématiques de POO généralistes qui dépassent le cadre de Windev
Je ne suis pas le dernier pour critiquer Windev, mais là je ne suis pas d'accord avec ton interprétation.
L'utilisation en direct est interdite aussi dans les autres langages à moins de passer par un transtypage, qui est possible en Windev, quoi que la syntaxe soit effectivement lourdingue.
Quant au fait d'utiliser cette indirection, qui semble tant te choquer, on peut faire exactement la même chose avec les outils de reflection de C# :-)
(pour java, je crois me souvenir que c'est tout à fait possible aussi)
Bref, j'en reviens au sujet initial : la gestion des interfaces est définitivement pourrie en Windev, mais pour ce qui est des histoires de "downcasting", il permet de faire la même chose qu'un C# et ne mérite, à mon avis, pas tant de haine
Pour revenir à ton problème initial, la copie ne peut pas se faire directement, il faut passer par une méthode "Copie". Un truc du style:
Définitions:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 I_MonInterface est une Interface procédure ProcedureInterface(MonParamètre est entier) procédure Copie(MonObjet est CMaClasse) FIN
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 CMaClasse est une Classe implémente I_MonInterface m_saMonMembre1 est une chaîne m_nMonMembre2 est un entier m_bMonMembre3 est un booléen FINUtilisation :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 PROCÉDURE Constructeur(saPM1 est chaîne="",nPM2 est entier =0,bPM3 est un booléen=Faux) :m_saMonMembre1=saPM1 :m_nMonMembre2=nPM2 :m_bMonMembre3=bPM3 PROCÉDURE Copie(clMonObjet est un CMaClasse) clMonObjet<=objet
En fonction du type de copie désirée, on doit modifier la méthode copie
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 clObjet1 est CMaClasse clObjet2 est CMaClasse iInterfaceTest est I_MonInterface clObjet1=allouer un CMaClasse("Test") iInterfaceTest<-clObjet1 SI iInterfaceTest<>Null ALORS iInterfaceTest.Copie(clObjet2) FIN
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 PROCÉDURE CopieValeur(clMonObjet est un CMaClasse) clMonObjet<=objet
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 PROCÉDURE CopieAdresse(clMonObjet est un CMaClasse dynamique) clMonObjet<-objet
Il y a peut-être plus simple, mais ça tourne.
Quand tout a échoué utilisez l'option RTFM
Merci Voltorinquo.
Je saisis bien ton idée de passer par une méthode.
Malheureusement c'est beaucoup trop lourd, surtout pour quelque chose qui devrait (dans un monde idéal) être faisable en une ligne, sans rien changer et de manière transparente...
Je préfère me passer des interfaces et utiliser uniquement des classes, c'est plus rentable pour moi.
Mais merci pour ton aide et tes idées.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager