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 :

POO - Héritage et constructeurs [WD16]


Sujet :

WinDev

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2012
    Messages : 6
    Points : 4
    Points
    4
    Par défaut POO - Héritage et constructeurs
    Bonjour,

    J'ai un petit problème avec les constructeurs des mes classes qui vont comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    MonAncetre est une classe
    ... m_clUnObjet
    FIN
     
    Constructeur(clObjet)
    ... m_clUnObjet = clObjet
    FIN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Maclasse est une classe
    ... Herite de MonAncetre
    FIN
     
    Constructeur(clObjet)
    ... Ancêtre:Constructeur(clObjet)
    FIN
    Lorsque je créer une instance de Maclasse, je veux que le constructeur de ma classe parent soit appelé pour assigner l'objet au membre, mais le constructeur de ma classe enfant appel toujours un constructeur sans paramètre de la classe parent qui n'existe pas. Bien entendu je peux toujours ajouter une syntaxe sans paramètre au constructeur de la classe parent, mais je ne veux pas avoir a recopier le code de mon constructeur parent inutilement dans la classe enfant.

    Merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 248
    Points : 12 892
    Points
    12 892
    Par défaut
    Bonjour,
    Tu ne peux pas empêcher l'appel du constructeur d'une classe ancêtre depuis une classe héritée (enfin i me semble).
    Mais tu peux aussi faire ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    MonAncetre est une classe
    ... m_clUnObjet
    FIN
     
    Constructeur(clObjet = null)
    SI clObjet <> null ALORS
    ... m_clUnObjet = clObjet
    FIN
    FIN
    Ainsi l'appel "par défaut" du constructeur de la classe ancêtre ne pause plus de problème.

    Tatayo.

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2012
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    En fait c'est le paramêtre qui est perdu en cours de route qui cause problème. Je souhaite que le constructeur de la classe ancêtre soit appelé avec le paramêtre recu dans le constructeur de la classe enfant.

    Voici l'erreur que j'obtient si ca peut aider.

    Erreur à la ligne 0 du traitement Constructeur de la classe Maclasse.
    Les paramètres d'appel du code 'Constructeur de la classe MonAncetre' sont incorrects : on attendait 1 paramètres et on en a reçu 0.

  4. #4
    Membre éprouvé Avatar de wimbish
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 416
    Points : 1 073
    Points
    1 073
    Par défaut
    Bonjour,

    Que dit le débogueur, à quel moment l'objet clObjet devient null?
    Est un objet dynamique?

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 248
    Points : 12 892
    Points
    12 892
    Par défaut
    Citation Envoyé par m.renaud Voir le message
    En fait c'est le paramêtre qui est perdu en cours de route qui cause problème. Je souhaite que le constructeur de la classe ancêtre soit appelé avec le paramêtre recu dans le constructeur de la classe enfant.

    Voici l'erreur que j'obtient si ca peut aider.
    Justement, si tu modifies le constructeur tel que je te l'ai indiqué, le paramètre devient optionnel, et tu n'auras plus l'erreur.

    Tatayo.

  6. #6
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2012
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Merci pour votre aide à tous les deux.

    @tatayo:
    Avec le paramètre optionnel je n'obtiens plus l'erreur, mais du coup je permet de créer un instance de Maclasse sans avoir a lui passer l'objet. Je vais devoir vivre avec

    @wimbish:
    Avec la solution de tatayo, je suis maintenant en mesure de suivre les appels avec le débuggeur sans rencontrer d'erreur et du coup j'ai vu ce qui causait l'erreur. Lors de l'instanciation d'un objet Maclasse avec l'objet en paramètre, c'est le constructeur de MonAncetre qui est appelé en premier sans recevoir le paramêtre (ce qui causait l'erreur) et seulement ensuite le constructeur de ma classe est appelé. Donc, peu importe ce que j'écris dans le constructeur de Maclasse, il y a toujours une erreur de causé sans la vérification de l'objet null.

    Voici mon code au final:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    MonAncetre est une classe
    ... m_clUnObjet
    FIN
     
    Constructeur(clObjet = null)
    ... SI clObjet <> null ALORS
    ... ... init(clObjet)
    ... FIN
    FIN
     
    Procedure init(clObjet)
    ... m_clUnObjet = clObjet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Maclasse est une classe
    ... Herite de MonAncetre
    FIN
     
    Constructeur(clObjet)
    ... init(clObjet)
    FIN

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 248
    Points : 12 892
    Points
    12 892
    Par défaut
    Citation Envoyé par m.renaud Voir le message
    Merci pour votre aide à tous les deux.

    @tatayo:
    Avec le paramètre optionnel je n'obtiens plus l'erreur, mais du coup je permet de créer un instance de Maclasse sans avoir a lui passer l'objet. Je vais devoir vivre avec
    Il existe peut-être une solution: essaie de rendre le constructeur par défaut (i.e. sans paramètre) protégé, ce qui le rend inaccessible en dehors de la classe et des classes héritées, et ajoutes un autre constructeur (publique) qui récupère un clObjet en paramètre.
    Je n'ai pas Windev sous la main, je ne sais pas si on peut avoir un constructeur publique et un autre protégé, à tester donc. Mais en théorie ça doit fonctionner.

    Tatayo.

  8. #8
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2012
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    J'ai tenté le coup, mais malheureusement ce n'est pas possible. J'obtiens l'erreur "Les attributs des syntaxes d'une procédure doivent être les mêmes".

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 248
    Points : 12 892
    Points
    12 892
    Par défaut
    C'est un peu ce que je craignais, et c'est bien dommage... Je ferai bien une demande en ce sens à PcSoft, on ne sait jamais, pour la version 19

    Quoi qu'il en soit, je vois une dernière solution:
    1. Tu rends les constructeurs (sans paramètre) des deux classes protégés
    2. Dans chaque classe, tu définies une méthode globale qui renvoie une instance de la classe en question (elle remplace le constructeur)
    3. Dans la classe ancètre, tu ajoutes une méthode qui reprends le code de ton constructeur actuel

    Ainsi les classes ne sont plus instanciables directement, il faut passer par la méthode globale, et comme le constructeur ne fait plus rien tu n'est plus géné par son appel lors de l'instanciation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    MonAncetre est une classe
    ... m_clUnObjet
    FIN
     
    PROCEDURE PROTEGEE Constructeur()
     
    FIN
     
    Procedure init(clObjet)
    ... m_clUnObjet = clObjet
     
    Procedure globale INSTANCIATION(clObjet)
    MonInstance est un MonAncetre dynamique
     
    MonInstance = allouer un MonAncetre
    MonInstance:init(clObjet)
    renvoyer MonInstance
     
    Maclasse est une classe
    ... Herite de MonAncetre
    FIN
     
    Procédure protégée Constructeur ()
     
    FIN 
     
    procédure globale Instanciation(ClObjet)
    MonInstance est un MaClasse dynamique
     
    MonInstance = allouer un MonClasse
    MonInstance:init(clObjet)
    renvoyer MonInstance
    C'est une mise en application du design pattern Factory.

    Pour utiliser la classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MonObjet est un MaClasse dynamique
     
    MonObjet = MaClasse::Instanciation(xxx)

    Tatayo.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 303
    Points : 815
    Points
    815
    Par défaut
    Bonjour,

    Méconnaissance de la syntaxe du WLangage pour l'appel explicite du constructeur de la classe parent ?

    Constructeur et destructeur
    http://doc.pcsoft.fr/fr-FR/?6010001&...ur%20%28POO%29

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    MonAncetre est une classe
        m_clUnObjet
    FIN
     
    Constructeur(clObjet)
        m_clUnObjet = clObjet
    FIN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Maclasse est une classe
        hérite de MonAncetre
    FIN
     
    Constructeur(clObjet)
        Constructeur MonAncetre(clObjet)
    FIN

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 248
    Points : 12 892
    Points
    12 892
    Par défaut
    Citation Envoyé par OnePoint Voir le message
    Bonjour,

    Méconnaissance de la syntaxe du WLangage pour l'appel explicite du constructeur de la classe parent ?
    Bien vu , je ne connaissais pas cette syntaxe.
    Je me le note dans un coin, ça risque fort de me servir.

    Tatayo.

  12. #12
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2012
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Merci pour l'éclaircissement, cette partie de la doc m'avait échappé. Maintenant tout fonctionne à merveille.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [POO] héritage de constructeurs
    Par benkunz dans le forum Langage
    Réponses: 2
    Dernier message: 03/04/2007, 15h29
  2. [POO] Poo : héritage & constructeur
    Par Invité dans le forum Langage
    Réponses: 3
    Dernier message: 11/07/2006, 14h29
  3. [POO] surcharger le constructeur
    Par wdionysos dans le forum Langage
    Réponses: 9
    Dernier message: 22/03/2006, 15h42
  4. [POO]héritage du constructeur de la classe parente
    Par new_wave dans le forum Langage
    Réponses: 7
    Dernier message: 10/03/2006, 14h25
  5. [POO-Héritage] Appel du constructeur en PHP4.3.2
    Par raoulchatigre dans le forum Langage
    Réponses: 4
    Dernier message: 28/11/2005, 15h37

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