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 :

[WD28] - POO : abstrait ou virtuel


Sujet :

WinDev

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 119
    Points : 92
    Points
    92
    Par défaut [WD28] - POO : abstrait ou virtuel
    Bonjour, bonsoir,

    Je poste car je n'ai pas trouvé et que la communauté m'a toujours éclairé.

    J'ai l'intuition que la POO est appropriée à l'évolution de mon projet.
    J'ai donc suivi des tutos, testé, expérimenté.

    Et je sèche sur 2 notions : abstraite et virtuelle.
    Il semblerait que la qualification de "virtuelle" et "abstraite" pour une même méthode se recouvre.
    Voir aide :

    Nom : poo.PNG
Affichages : 182
Taille : 9,2 Ko

    Je n'arrive pas à comprendre l'intérêt de déclarer explicitement le caractère "virtuelle".
    Mais je comprends parfaitement l'intérêt de déclarer le caractère "abstrait".

    Est-ce que vous pouvez m'éclairer sur l'utilisation de ces qualifications (abstrait / virtuelle) : portée, limite, etc.
    En quoi ils sont complémentaires, différents, etc.

    D'avance un tout grand merci.

    Et belle soirée (journée)

  2. #2
    Membre éclairé
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2017
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2017
    Messages : 336
    Points : 809
    Points
    809
    Par défaut
    Yop,

    bon, c'est de la POO, donc je peux aider vu que je ne fais que ça ; je laisse mes pair me corriger si je me trompe car j'ai mené quelques recherches, n'ayant jamais tapé le mot clé virtuelle dans une méthode...et la doc indiquant qu'une méthode redéfinie est par défaut virtuelle, même si ce n'est pas écrit dans le code donc, j'ai une idée.

    Une méthode abstraite est une méthode de la classe mère que tu DOIS redéfinir dans les classes dérivées.
    En C++, il existe le mot clé sealed, qui indique à l'inverse que tu N'AS PAS LE DROIT de redéfinir une méthode dans une classe dérivée, elle est définie dans la classe mère et c'est tout. Ce mot clé n'existe pas en Windev, on ne peut pas interdire la redéfinition à ma connaissance.

    Et entre les deux, y'a les méthodes virtuelles, que tu PEUX redéfinir, sans être obligé, et si tu le fais, la méthode redéfinie est forcément virtuelle. En fait une méthode qui n'est pas abstraite est donc virtuelle par défaut, mais c'est pas expliqué ainsi, en tout cas d'après ma lecture et mes tests, c'est ainsi que je le comprends. Je vais demander au STG plus de précisions sur le sujet.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 119
    Points : 92
    Points
    92
    Par défaut
    Merci @kunnskap

    Déjà, j'ai bien compris les heures de tuto que je me suis enfilé
    Et j'avais bien appréhendé la notion d'abstraite.

    Quant à la notion de virtuelle, cette qualité ne servirait à rien si ce n'est un aide-mémoire ?
    Ce serait étonnant.

    J'ai poursuivi mes investigations, et j'ai trouvé une utilisation d'une méthode virtuelle dans un exemple fourni avec Windev (POO Simple).

    Voir print-screen dessous :


    Nom : poo2.PNG
Affichages : 138
Taille : 8,2 Ko

    J'ai testé cet exemple en supprimant le caractère virtuel de toutes les méthodes de toutes les classes.
    ça n'a rien changé au comportement du projet et aucune erreur ou warning.

    Toutes les contributions sont les bienvenues.

  4. #4
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 145
    Points : 9 607
    Points
    9 607
    Par défaut
    Je ne pratique pas du tout la POO ... donc vous n'êtes pas obligé de lire la suite

    Par défaut, une méthode est virtuelle. Donc effectivement, que tu mettes le mot VIRTUELLE ou pas, ça ne change rien. Logique.
    Du coup, à quoi sert ce mot Virtuelle ???
    Je pense que ce mot sert à la relecture du code : ok, le programmeur a explicitement dit que la procédure serait virtuelle.
    Il sert probablement aussi à la compilation, pour provoquer une erreur si par méconnaissance, on déclarait une procédure 'PROCEDURE VIRTUELLE ABSTRAITE'.

    D'après le message de Kunnskap, il y a 3 niveaux sur une échelle : (1)SEALED - (2)intermédiaire - (3)Abstraite.
    Et d'après ce que je comprends, la transcription en windev serait :
    (1)SEALED : impossible de déclarer ce statut en Windev
    (2)intermédiaire : procédure Virtuelle, ou procédure (sans le mot Virtuelle ni abstraite)
    (3)Abstraite : Procédure Abstraite.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  5. #5
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 64
    Points : 102
    Points
    102
    Par défaut
    Bonjour,

    L’attribut ‘virtuelle’, sur une méthode est utile dans un contexte particulier :
    La classe B hérite de la classe A.
    La méthode ‘MaMethode’ existe dans A et dans B.
    Si ‘MaMethode’ est virtuelle : la méthode ‘MaMethode’ de la classe B sera toujours appelée
    Si ‘MaMethode’ n’est pas virtuelle : La méthode ‘MaMethode’ de la classe B sera appelé si l’appel se fait depuis la classe ; mais ce sera ‘MaMethode’ de la classe A, si l’appel se fait depuis la classe A.

    J’ai pu constater ce fonctionnement par le passé (de mémoire, il y avait de l’héritage multiple), mais, en voulant illustrer le cas notre équipe, il s’avère que c’est toujours la méthode la plus spécialisée qui est exécutée.
    Audit gratuit et automatique de vos analyses : https://wdaudit.fr

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 123
    Points : 84
    Points
    84
    Par défaut
    Bonjour,

    Petit exemple théorique (et simplifié...) pour expliquer l'intérêt d'une méthode virtuelle (et non abstraite) :

    Soit une classe "FOO" qui contient, entre autre, une méthode AfficherTableauDeBord() qui permet d'afficher diverses informations à l'écran. Cette méthode est donc virtuelle.

    Soit une seconde classe "FOOBAR" qui hérite de "FOO". On souhaite, dans cette classe, avoir une méthode qui permet d'afficher les mêmes choses que dans FOO, mais avec des informations supplémentaires.
    On va donc redéfinir la méthode AfficherTableauDeBord(), et dans cette méthode, on va :
    - Appeler la méthode de la classe mère (qui affichera donc les informations de base)
    - Puis afficher les informations complémentaires qui nous intéressent.

    L'exemple est volontairement simpliste, mais c'est un cas d'utilisation qui est très courant en POO.

    Pour en revenir plus précisément à Windev, effectivement la doc indique que toutes les procédures sont virtuelles par défaut.
    De mémoire, c'est la même chose en Java (toutes les méthodes sont implicitement virtuelles par défaut), mais pas en C#.

  7. #7
    Membre éclairé
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2017
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2017
    Messages : 336
    Points : 809
    Points
    809
    Par défaut
    Me revoilààà.
    Alors, suite à mes 2 demandes au STG:

    -effectivement Windev ne permet pas d'interdire la redéfinition. Il la permet par défaut, peut l'obliger via les méthodes abstraites mais pas l'interdire
    -@ben-34 a raison et j'ai fait la même recherche que lui: dans le cas qu'il décrit Windev appelle toujours la méthode la plus spécialisée, celle de la classe dérivée. Ce qui à mon sens est une erreur. Je leur ai transmis une demande de renseignement technique sans même présumer du fait que c'était un bug auprès d'eux, et ils m'ont dit que le problème a été transmis à l'équipe de développement pour analyse. Donc le comportement est peut être anormal et ce serait l'utilité du mot-clé VIRTUELLE

  8. #8
    Membre éclairé
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2017
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2017
    Messages : 336
    Points : 809
    Points
    809
    Par défaut
    Voici la réponse de PC SOFT qui clarifie la situation:

    "Voici les explications du mot clé "virtuel" :

    Il y a une option dans le projet qui s'appelle "Classe : les méthodes de mêmes noms sont automatiquement virtuelles".

    - Lorsque l'option est cochée (par défaut dans les projets créés depuis une vingtaine d'années), le mot-clé "virtuel" n'a effectivement plus aucun effet.

    - Lorsque l'option est décochée, le comportement correspond à l'ancien système = méthode non virtuelle depuis l'intérieur des classes mais malgré tout virtuelle depuis l'extérieur des classes.

    Le mot-clé "virtuel" permet alors de forcer la méthode virtuelle depuis l'intérieur des classes.

    Cet ancien comportement n'est conservé que pour compatibilité dans les vieux projets.

    Le masquage en WLangage :

    Le système de "masquage" tel qu'on pourrait l'avoir en C++ n'est pas disponible tel quel en WLangage.
    Le contournement actuel est donc obligatoirement de donner des noms différents aux méthodes."

    Ceci, donne le fin mot de l'histoire.

Discussions similaires

  1. classe abstraite & méthodes virtuelles
    Par Tho123 dans le forum C++
    Réponses: 4
    Dernier message: 24/04/2012, 00h53
  2. Réponses: 15
    Dernier message: 05/07/2007, 02h29
  3. [POO] Héritage, fonctions virtuelles
    Par mamid1706 dans le forum C++
    Réponses: 8
    Dernier message: 09/05/2007, 12h43
  4. [POO] Classes abstraites
    Par GLDavid dans le forum Langage
    Réponses: 12
    Dernier message: 02/03/2006, 12h18
  5. [POO] class abstraite et methode magic
    Par jeff_! dans le forum Langage
    Réponses: 14
    Dernier message: 25/01/2006, 00h19

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