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

Langage Delphi Discussion :

Appel de méthode d'une classe fille à partir de la classe mère


Sujet :

Langage Delphi

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Appel de méthode d'une classe fille à partir de la classe mère
    Bonjour à tous.

    Petite question : peut-on lancer une méthode d'une classe fille à partir de la classe parent ?

    Je m'explique pour ceux qui ont le courage de lire :

    J'ai une classe Mère avec une méthode virtual abstract.
    J'ai plusieurs classe Fille dans lesquelles est forcément déclaré ma méthode.

    Pour différentes raisons, dans une partie du programme, j'ai un objet de type Classe mère, mais j'aimerais appeler la méthode de la classe fille.

    Il y a bien la solution :
    si objet est classe_fille_1 alors classe_fille_1(objet).méthode
    si objet est classe_fille_2 alors classe_fille_2(objet).méthode

    mais elle oblige le code a connaitre tous les type de classe fille. J'aurais aimé éviter.


    ...

    Maintenant, j'ai comme un doute sur la faisabilité, n'y passer pas trop de temps.

    Salutations à tous.

  2. #2
    Membre émérite
    Avatar de skywaukers
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2005
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 216
    Points : 2 303
    Points
    2 303
    Par défaut
    Bonjour,

    oui bien sur, c'est même naturel. Déjà logiquement une classe qui contient une métode abstraite ne doit pas être instanciée, sous peine d'obtenir des messages d'erreur à l'exécution en cas d'appel des méthodes Abstraites justeùent. (par exemple si tu fais un MaListe := TStrings.Create; tu vas obtenir un conseil au moment de la compilation).
    Donc puisque tes classes filles héritent de ta classe mère et qu'elles implémentent Methode, rien ne t'empêche d'écrire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure MaProc
    var
      MonObjet1: ClassMere;
      MonObjet2: ClassMere;
    begin
      Monobjet1 := ClassFille_1.Create;
      MonObjet2 := ClassFille_2.create;
     
      MonObjet1.Methode; // appelera Methode définit dans ClasseFille_1
      MonObjet2.Methode; // appelera Methode définit dans ClasseFille_2
     
    end;
    @++
    Dany

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Merci pour ta réponse.
    Je m'en doutais un peu, mais c'était au cas où...

    En fait j'ai une application presque générique avec des modules de base qui sont communs à tous mes projets. La classe mère est déclarée dans ces modules de base.

    Les classes filles sont déclarées dans les modules spécifiques à chaque projet. Je tente de diminuer le code dans ces modules spécifiques, d'où ma requête.
    Parce que, forcément, la classe mère ne connait pas toutes les classes Filles.

    Je vais donc ajouter une fonction dans un de ces modules spécifiques en utilisant les classes filles.

    J'ai pourtant pris des cours sur les 'techniques industriels du logiciel'. C'était un peu pompeux comme formation, et je ne suis pas au point .

    Merci.

  4. #4
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut
    Citation Envoyé par Bwana Voir le message
    Parce que, forcément, la classe mère ne connait pas toutes les classes Filles.
    Je dirais plutôt que la classe mère n'est pas censée connaitre ses classes filles, alors que l'inverse est toujours vrai.

    @+ Claudius.

  5. #5
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par Bwana Voir le message
    Bonjour à tous.

    Petite question : peut-on lancer une méthode d'une classe fille à partir de la classe parent ?

    Je m'explique pour ceux qui ont le courage de lire :

    J'ai une classe Mère avec une méthode virtual abstract.
    J'ai plusieurs classe Fille dans lesquelles est forcément déclaré ma méthode.

    Pour différentes raisons, dans une partie du programme, j'ai un objet de type Classe mère, mais j'aimerais appeler la méthode de la classe fille.

    Il y a bien la solution :
    si objet est classe_fille_1 alors classe_fille_1(objet).méthode
    si objet est classe_fille_2 alors classe_fille_2(objet).méthode

    mais elle oblige le code a connaitre tous les type de classe fille. J'aurais aimé éviter.


    ...

    Maintenant, j'ai comme un doute sur la faisabilité, n'y passer pas trop de temps.

    Salutations à tous.
    mais euh...si ce n'est pour permettre cet appel, à quoi pourrait bien service les méthodes virtuelles ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    mais euh...si ce n'est pour permettre cet appel, à quoi pourrait bien service les méthodes virtuelles ?
    Paul, tu fais renaitre l'espoir en moi. Mais je crains que tu n'ais mal compris ce que je veux souhaite.
    En clair c'est écrire ce code :


    classe_mere.méthode



    Et je voudrais que le compilateur retrouve tout seul quel est le type de la classe fille, et lance la méthode appropriée pour la classe fille.

    Le soucis :
    Si la méthode n'est que virtuelle, c'est la méthode de la mère qui est utilisée.
    Si la méthode est aussi abstraite, j'ai une erreur normale d'exécution.

    Si il y en a que ça amuse, voici un bout de code joint pour ceux qui veulent tester.
    La solution avec le bouton marcherait, mais elle m'oblige à connaitre les filles.
    Et malheureusement, Claudius a mis le doigt sur le problème : maman reconnait pas fifille....

    Merci pour les avis...

    et bonne soirée.

    Olivier
    Fichiers attachés Fichiers attachés

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Citation Envoyé par Bwana Voir le message
    Paul, tu fais renaitre l'espoir en moi. Mais je crains que tu n'ais mal compris ce que je veux souhaite.
    Si si, il a très bien compris, puisque le mot clé virtual sert exactement à la problématique que tu décris !
    Pouvoir invoquer une méthode virtuelle avec une variable de type parent mais contenant une référence vers une instance de type fille
    Tu n'évoques jamais override, cela m'inquiète !

    Citation Envoyé par Bwana Voir le message
    Si la méthode n'est que virtuelle, c'est la méthode de la mère qui est utilisée.
    Si la méthode est aussi abstraite, j'ai une erreur normale d'exécution.
    Tu dois avoir des erreurs de compilation indiquant l'instanciation de classe abstraite :
    E2373 Appel à la méthode abstraite %s.%s (Delphi)
    E2402 Construction de l'instance de la classe abstraite '%s' (Delphi)

    Si tu passes par une référence de classe, class of, tu peux effectivement réussir à instancier une classe abstraite
    Tu peux protéger ton code via try except on EAbstractError

    Et n'oublie pas tes override pour bien marquer que fait une redéfinition !
    Si tu l'oublies, tu as des warnings :
    W1010 La méthode '%s' cache la méthode virtuelle du type de base '%s' (Delphi)
    Et cela n'as pas l'effet escompté, tout cela écrit dans la documentation Méthodes (Delphi) - Redéfinition ou masque

    Comme le cite skywaukers, La TStrings est le parfait exemple, tu la TStringList, La TMemoStrings interne au TMemo, la TComboStrings pour les Combos !
    Tu as voir dans 50 variantes de TStrings avec différentes implémentations selon leur utilisation !
    De l'extérieur, tu invoques toujours des méthodes la TStrings (la mère) sans savoir qu'il y a une multitude de fille

    Un cas encore plus fréquent mais pas forcément bien connu, le destructor Destroy !
    On invoque le Free du TObject
    C'est le Free du TObject qui appele le Destroy
    et comme Destroy est virtual, on le redéfini via override dans toutes les classes filles qui ont quelque chose à libérer
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    ok, petit rappel sur les objets

    une classe possède une VMT (Virtual Method Table) qui contient un pointeur vers chacune de ses méthodes virtuelles. Les méthodes statiques (non virtuelles, à ne pas confondre avec le "static" du C++) sont invoquées directement sans passer par la VMT, elles ne sont donc pas surchargeables.

    la classe enfant possède une VMT qui peut remplacer les pointeurs de la VMT parente (mot clé override), du coup l'appel de la méthode virtuelle parent arrive sur la méthode surchargée enfant.

    Dans ton code, comme le dit Shai, TMaman.ShowChuiQui est bien dans la VMT car virutelle, mais TFi_Fille1.ShowChuiQui étant statique elle ne remplace pas la méthode du parent. Ajoute simplement "override" et le tour est joué.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Yesssss
    Ha bah mince alors !!!
    Ca marche....Pile poil ça qu'est-ce que je voulais !
    Messieurs, je n'aurais qu'un seul mot :

    Merci à tous, vous fûtes fort efficace.
    Bonne soirée et bonne continuation.

    Olivier

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

Discussions similaires

  1. Instance d'une classe fille à partir d'une classe mère
    Par Mathieu Salles dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 17/10/2012, 16h09
  2. Réponses: 1
    Dernier message: 26/12/2010, 19h29
  3. Réponses: 2
    Dernier message: 27/05/2010, 13h35
  4. [PHP 5.3] [POO] Appel de méthode dans une autre méthode de la même classe
    Par LunaSev dans le forum Langage
    Réponses: 10
    Dernier message: 18/05/2010, 15h24
  5. Réponses: 2
    Dernier message: 15/09/2009, 16h55

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