IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Interface, objet et affectation


Sujet :

WinDev

  1. #21
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 122
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par mous97 Voir le message
    Montre moi comment le DownCasting est géré alors je te confirme que ce n'est pas le cas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    O est un MaClasseMere dynamique 
    O = allouer MaClasseFille()
    ça marche (et heureusement !)

  2. #22
    Membre habitué Avatar de mous97
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Février 2018
    Messages : 119
    Points : 175
    Points
    175
    Par défaut
    Citation Envoyé par fred_malette Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    O est un MaClasseMere dynamique 
    O = allouer MaClasseFille()
    ça marche (et heureusement !)
    ça marche, mais peux tu accéder à des membres de la classe MaClasseFille ?

  3. #23
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 122
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par mous97 Voir le message
    ça marche, mais peux tu accéder à des membres de la classe 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".

  4. #24
    Membre habitué Avatar de mous97
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Février 2018
    Messages : 119
    Points : 175
    Points
    175
    Par défaut
    Citation Envoyé par fred_malette Voir le message
    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.

  5. #25
    Membre habitué Avatar de mous97
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Février 2018
    Messages : 119
    Points : 175
    Points
    175
    Par défaut
    Citation Envoyé par fred_malette Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    O est un MaClasseMere dynamique 
    O = allouer MaClasseFille()
    ça marche (et heureusement !)
    Et d'ailleurs avec ce code tu remarqueras dans le deboger que O est typé comme une MaClasseFille après l'affectation. Mais tu ne peux pas accèder aux membres ni méthodes de celle-ci. Tu trouves toujours ça logique ?

  6. #26
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 122
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par mous97 Voir le message
    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# :

    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
    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
                ((MaClasseFille)a).PropFille= "FOO"; // OK là ça marche
    Mais ceci est possible aussi en Windev, quoique de manière un peu plus pénible.

    Conclusion : le downcasting est donc bien possible.

  7. #27
    Membre habitué Avatar de mous97
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Février 2018
    Messages : 119
    Points : 175
    Points
    175
    Par défaut
    Citation Envoyé par fred_malette Voir le message
    Je pense qu'on a un pb de communication

    Ce que tu dis, tel que je le comprends, ne marche pas en C# :

    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
    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
                ((MaClasseFille)a).PropFille= "FOO"; // OK là ça marche
    Mais ceci est possible aussi en Windev, quoique de manière un peu plus pénible.

    Conclusion : le downcasting est donc bien possible.
    Effectivement je me suis mal exprimé je faisais allusion au downcasting de type, et sur Windev jusqu'à preuve du contraire je ne vois pas comment ils ont géré ça

  8. #28
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 122
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par mous97 Voir le message
    Effectivement je me suis mal exprimé je faisais allusion au downcasting de type, et sur Windev jusqu'à preuve du contraire je ne vois pas comment ils ont géré ça
    Ok, peux-tu me donner un exemple simple en C# de ce que tu appelles le "downcasting de type", j'aimerais bien comprendre ce que tu veux dire

    Merci d'avance.

  9. #29
    Membre habitué Avatar de mous97
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Février 2018
    Messages : 119
    Points : 175
    Points
    175
    Par défaut
    Citation Envoyé par fred_malette Voir le message
    Ok, peux-tu me donner un exemple simple en C# de ce que tu appelles le "downcasting de type", j'aimerais bien comprendre ce que tu veux dire

    Merci d'avance.
    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
    Comment tu reproduits ça en windev

  10. #30
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 122
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par mous97 Voir le message
    MaClasseMere a = new MaClasseFille();
    a.PropMere = "FOO"; // ok
    ((MaClasseFille)a).PropFille= "FOO"; // OK là ça marche

    Comment tu reproduits ça en windev
    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

  11. #31
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2003
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2003
    Messages : 941
    Points : 1 931
    Points
    1 931
    Par défaut
    Alors là moi je ne comprends trop grand chose:

    Comment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {"a.PropFille"} = "FOO";
    peut fonctionner et pas
    ????
    Philippe,


    N'hésitez à lever le pouce si mon aide vous a été utile.

  12. #32
    Membre habitué Avatar de mous97
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Février 2018
    Messages : 119
    Points : 175
    Points
    175
    Par défaut
    Citation Envoyé par fred_malette Voir le message
    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
    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.

  13. #33
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 122
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par philouZ Voir le message
    Alors là moi je ne comprends trop grand chose:

    Comment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {"a.PropFille"} = "FOO";
    peut fonctionner et 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

  14. #34
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 122
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par mous97 Voir le message
    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.
    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

  15. #35
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 799
    Points : 5 240
    Points
    5 240
    Billets dans le blog
    1
    Par défaut
    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
    FIN
    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
    Utilisation :
    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
    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
    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

  16. #36
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 122
    Points : 81
    Points
    81
    Par défaut
    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.

Discussions similaires

  1. Problème d'interface objets externes avec GUID
    Par asecos dans le forum Langage
    Réponses: 3
    Dernier message: 23/11/2019, 08h19
  2. Diagramme et interface objet à la Delphi ..
    Par 4Ur3L dans le forum GUI
    Réponses: 1
    Dernier message: 13/11/2009, 20h35
  3. [Facade] Donner une interface objet à une librairie Java, quel est ce pattern ?
    Par Pierre8r dans le forum Design Patterns
    Réponses: 3
    Dernier message: 28/10/2008, 12h19
  4. Développement Bdd et Interface Objet
    Par Loric dans le forum Débuter
    Réponses: 2
    Dernier message: 29/12/2007, 19h06
  5. Réponses: 2
    Dernier message: 29/10/2003, 23h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo