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 :

et 25 : POO Méthode/Propriété abstraite non redéfinie [WD24]


Sujet :

WinDev

  1. #1
    Membre actif

    Homme Profil pro
    Sans
    Inscrit en
    Mars 2018
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Mars 2018
    Messages : 153
    Points : 295
    Points
    295
    Billets dans le blog
    1
    Par défaut et 25 : POO Méthode/Propriété abstraite non redéfinie
    Bonjour,

    J'ai un petit soucis concernant l'appel de méthodes/propriétés abstraites redéfinies dans une classe fille et utilisées depuis une classe parent.

    Voici le contexte (exemple minimaliste de mon problème) :

    une classe abstraite acAnimal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    acAnimal is a Class, abstract
     
    	PROTECTED
    		_name is string
    END
     
    PROCÉDURE PROTECTED Constructor()
     
    PROCÉDURE ABSTRACT name() : string
    qui définie un membre _name et une propriété abstraite permettant de lire ce membre.

    Cette propriété abstraite est donc redéfinie dans les classe filles :

    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
     
    cDog is a Class
    	inherits acAnimal
     
    END
     
    PROCÉDURE PRIVATE Constructor(pName is string)
    _name = pName
     
    PROCÉDURE name() : string
    RESULT _name
     
    PROCÉDURE PUBLIC GLOBAL createInstance(pName is string)
    anObject is acAnimal dynamic <- new cDog(pName)
    RESULT anObject
    Il suffit, pour créer une instance de chien de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    aDog is acAnimal dynamic <- cDog.createInstance("Médor")
    et le code suivant ne pose aucun problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    trace(aDog.name) // La trace donne Médor
    Si, maintenant, je passe par un objet qui doit manipuler plusieurs animaux, appelons le cAnimalManager :

    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
     
    cAnimalManager is a Class
     
    	PRIVATE
    		_animals is array of acAnimal dynamic
     
    END
     
    PROCÉDURE PRIVATE Constructor()
     
    PROCÉDURE PUBLIC GLOBAL createInstance()
    anObject is cAnimalManager dynamic <- new cAnimalManager
    RESULT anObject
     
    PROCÉDURE addAnimal(pAnimal is acAnimal)
    _animals.Add(pAnimal)
     
    PROCÉDURE traceAnimalName()
    FOR ALL animal OF _animals
    	Trace(animal.name)
    END
    Voici ce que j'obtiens à l'utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    group is cAnimalManager dynamic <- cAnimalManager.createInstance()
     
    //     Si l'ajout d'un animal passe par une variable intermédiaire comme ici, le trace du nom (méthode abstraite redéfinie dans la classe fille) donne bien le résultat attendu.
    aDog is acAnimal <- cDog.createInstance("Colosse")
    group.addAnimal(aDog)
     
    //     Dans ce cas, l'animal est directement instancié comme paramètre dans l'appel de la méthode addAnimal()
    group.addAnimal(cDog.createInstance("Médor"))
    group.traceAnimalName()
    => au moment de tracer le nom j'obtiens l'erreur suivante :
    Nom : Methode abstraite non redefinie.jpg
Affichages : 386
Taille : 36,0 Ko

    Quelqu'un peut-il m'expliquer cette bizarrerie ?

    Merci à tous pour vos contributions.

    Padbrain

  2. #2
    Membre actif
    Homme Profil pro
    Ingé Indus
    Inscrit en
    Juillet 2014
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingé Indus
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 107
    Points : 241
    Points
    241
    Par défaut
    Bonjour,

    Juste pour être sur de bien comprendre: la fonction group.traceAnimalName() affiche bien "Colosse", mais plante sur médor?

    Je sais que Windev n'est pas au top dans la POO avancée.
    J'ai régulièrement des problèmes: des méthodes héritées qui sont redéfinies, ne sont pas exécutées. Ce sont celles héritées qui sont utilisé à la place En général une recompilation du projet suffit.

    Pour votre problème:
    Si on passe le tableau du manager en tableau de cDog. Je suppose que le trace fonctionnera. mais j'imagine que l'on perds tout l'intérêt de "forcer" l'utilisation de dog.

    Je proposerai de passer par une Interface.
    Ok: définition de l'interface, refaire la même chose dans la classe abstraite = travail en double.
    La classe abstraite devient peut-être inutile à ce moment si tout est abstrait.
    Ensuite, utiliser un tableau de cette interface dans le manager.

    Windev devrait être moins récalcitrant sur les conversion d'objet à ce moment.

  3. #3
    Membre actif

    Homme Profil pro
    Sans
    Inscrit en
    Mars 2018
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Mars 2018
    Messages : 153
    Points : 295
    Points
    295
    Billets dans le blog
    1
    Par défaut
    Bonsoir yoshi570,

    Merci pour votre intervention.

    ...Juste pour être sur de bien comprendre: la fonction group.traceAnimalName() affiche bien "Colosse", mais plante sur médor?...
    Oui, c'était bien ça.

    Le problème venait juste d'une omission involontaire de ma part dans la signature de la méthode addAnimal() de la classe cAnimalManager. Il fallait ajouter le mot clef dynamic pour profiter de la magie du polymorphisme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    PROCÉDURE addAnimal(pAnimal is acAnimal dynamic)
    à la place de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    PROCÉDURE addAnimal(pAnimal is acAnimal)
    et quand l'esprit est embrumé, on ne voit plus l'évidence.

    Bonne soirée.

  4. #4
    Membre actif
    Homme Profil pro
    Ingé Indus
    Inscrit en
    Juillet 2014
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingé Indus
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 107
    Points : 241
    Points
    241
    Par défaut
    Citation Envoyé par padbrain Voir le message
    Il fallait ajouter le mot clef dynamic
    Oh oui, je suis passé à coté. Cela m'avais value des prises de tête aussi.

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

Discussions similaires

  1. Réponses: 14
    Dernier message: 20/04/2016, 12h11
  2. [PHP 5.2] [POO] Propriétés statiques non partagées par les classes filles
    Par gege2061 dans le forum Langage
    Réponses: 5
    Dernier message: 08/09/2009, 15h25
  3. Réponses: 4
    Dernier message: 25/10/2008, 10h27
  4. [POO] Méthode abstraite PHP4
    Par joebarteam88 dans le forum Langage
    Réponses: 2
    Dernier message: 30/04/2007, 07h32
  5. [POO] balise ou objet non reconnu lors d'un deploiement serveur
    Par benssj5 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 02/01/2006, 17h26

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