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 : comportement des membres globaux (static) d'une classe [WD17]


Sujet :

WinDev

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 41
    Points : 70
    Points
    70
    Par défaut poo : comportement des membres globaux (static) d'une classe
    Bonjour,

    Je me heurte à un problème. J'ai bien des méthodes pour le contourner mais je ne les trouve pas à mon goût.

    Voici un extrait du code simplifié.

    ClasseAncetre est une classe
    Global
    Membre1 est une chaine=""

    FIN

    ClasseFille est une classe
    hérite de ClasseAncetre
    FIN

    Pour rappel, GLOBAL défini un membre "static" pour la classe.

    Question : ce membre est-il spécifique à une classe (possibilité d'affecter des valeurs différentes) ou bien la valeur est du membre est commune aux deux classes?

    D'après mes tests, les valeurs sont partagées, ce qui vous le devinerez ne m'arrange pas.

  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
    Citation Envoyé par lmontout Voir le message
    Pour rappel, GLOBAL défini un membre "static" pour la classe.
    Non, global permet de définir un membre global. Les variables/membres statiques n'existent pas (encore ?) dans Windev.
    Un membre statique existe en dehors de toute instantiation d'une classe, et est commun à toutes les instances d'une classe (et des classes dérivées).
    Une variable statique gardera sa valeur entre deux appels de la section de code dans laquelle elle est définie, mais dans le cas d'une classe n'est pas commune entre deux instances.
    Donc le comportement défini est tout à fait normal.

    Tatayo.

  3. #3
    Expert confirmé
    Homme Profil pro
    ?
    Inscrit en
    Juillet 2002
    Messages
    2 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ?

    Informations forums :
    Inscription : Juillet 2002
    Messages : 2 379
    Points : 4 496
    Points
    4 496
    Par défaut
    Bonjour
    Citation Envoyé par tatayo Voir le message
    Un membre statique existe en dehors de toute instantiation d'une classe, et est commun à toutes les instances d'une classe (et des classes dérivées).
    Tatayo.
    Oui et c'est bien le cas d’un membre global de classe dans Windev

    Extrait de l'aide :
    GLOBAL : Optionnel
    Définit un membre global. Ce membre existera en dehors des objets. Il pourra être utilisé sans instancier un objet. Si plusieurs objets sont déclarés, un membre global est commun à tous les objets.

  4. #4
    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
    hpascal, je m'aperçois que j'aurais du me relire:
    Citation Envoyé par tatayo Voir le message
    Bonjour

    Non, global permet de définir un membre global. Les variables/membres statiques n'existent pas (encore ?) dans Windev.
    Un membre global existe en dehors de toute instantiation d'une classe, et est commun à toutes les instances d'une classe (et des classes dérivées).
    Une variable statique gardera sa valeur entre deux appels de la section de code dans laquelle elle est définie, mais dans le cas d'une classe n'est pas commune entre deux instances.
    Donc le comportement défini est tout à fait normal.

    Tatayo

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 41
    Points : 70
    Points
    70
    Par défaut
    Merci pour ces précisions.

  6. #6
    Membre éprouvé

    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    402
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 402
    Points : 915
    Points
    915
    Par défaut
    En fait ton problème démontre sans doute une petite faute de conception.
    Si un membre est GLOBAL (ou STATIC) il paraît normal qu'il le soit entre les classes parent et enfant. c'est même primordial si tu veux utiliser une affectation polymorphe.

    Par exemple :

    une classe ANIMAL et un nombre GLOBAL nbAnimaux
    quand tu déclare un nouvel animal tu incrémente nbAnimaux dans le constructeur.
    C'est très pratique car tu as le nombre de tous les animaux qu'il s'agisse d'une souris ou d'une grenuoille.

    Maintenant supposons que tu souhaite justement avoir ton nombre de souris.
    le membre est bien nbSouris qui n'est pas du tout la même chose que nbAnimaux même si c'est tentant de n'avoir qu'un membre.

    trois possibilités s'offrent donc à toi :
    - nbAnimaux t'intéresse en tant que total de tous les animaux
    à ce moment là tu garde le GLOBAL dans la classe Animal.

    OU

    - nbAnimaux correspond pour toi au nombre dans l'espèce fille et tu ne t'intéresse pas au nombre des animaux espèces confondues.
    dans ce cas tu déclares bien nbAnimaux dans la classe parent et tu redéclare nbAnimaux en GLOBAL dans chaque classe enfant.
    grâce à la portée des variables ton membre nbAnimaux de la classe enfant va masquer la déclaration de nbAnimaux dans la classe parent. Mais l'affectation dans les classes parent et enfant va te permettre d'y accéder depuis un tableau d'animaux.


    OU la totale
    tu veux nbAnimaux comme total (GLOBAL) et aussi comme total dans l'espèce et dans ce cas tu dois déclarer deux variables :
    GLOBAL nbAnimaux dans la classe parent
    et GLOBAL nbIndividusEspece dans les classes enfant
    CAR ce sont bien deux infirmations différentes et donc deux membres différents il ne doivent donc pas avoir le même nom car ce serait une source de confusion importante pour tes collègues ou même pour toi dans six mois.

    A noter
    GLOBAL nbAnimaux dans la classe parent
    et GLOBAL nbAnimaux dans les classes enfant
    et que tu incrémente nbAnimaux dans le constructeur de la classe parent
    et dans celui de la classe enfant
    Alors c'est le jackpot car
    Animaux::nbAnimaux te donne le nombre total
    Souris::nbAnimaux le nombre total de souris
    Grenuoille::Animaux le nombre de grenouilles

    mais attention aux confusions...

    Crdlt

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 12/03/2013, 13h23
  2. Réponses: 7
    Dernier message: 12/11/2011, 15h09
  3. Réponses: 3
    Dernier message: 19/08/2011, 09h37
  4. utiliser les méthodes d'un membre static d'une classe
    Par tonio_a_588 dans le forum C++
    Réponses: 4
    Dernier message: 06/01/2011, 21h44
  5. Réponses: 2
    Dernier message: 02/06/2010, 14h28

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