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

C++ Discussion :

[heritage] downcasting : une erreur de conception?


Sujet :

C++

  1. #1
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut [heritage] downcasting : une erreur de conception?
    Bonjour à tous !!!

    J'ai un problème pas trop grave, mais que j'aimerai bien résoudre proprement!
    Vous trouverez ci joint une partie de mon diagramme des classes...

    CFP est une classe abstraite car la méthode setImageReferenceIR() ne peut pas être définie de la même manière dans toutes les classes filles. Celà m'arrange car de toute façon, je préfère que CFP soit non instanciable, même si elle a un sens ici...
    Ma configuration est telle que setImageReferenceIR() possède la même implantation dans Antenne que dans HR. La seule différence est pour la classe LPT.

    Mon projet concerne pour l'instant l'étude de phénomène physiques à l'aide des classes HR et Antenne, et pourra peut-etre à terme concerné la classe LPT.

    Mon problème est le suivant:
    J'ai pour l'instant implémenté des algorithmes dans la classe CFP qui marchent très bien pour Antenne et HR, mais pas pour LPT.
    Etant donné qu'il y a qu'une seule petite fonction membre qui diffère, est ce que je pourrai pas "downcaster" setImageReferenceIR? Ou alors quis-je obliger de définir tous mes algorithmes dans chacunes des classes filles pour pouvoir bénéficier de setImageReferenceIR() ???

    Merci à vous!
    Images attachées Images attachées  

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    Je dirais que visiblement les algorithmes communs à Antenne et HR mais non à LPT ne devraient pas être factorisées dans CFP, qui regroupe les traitements communs à tous, mais dans une nouvelle classe située dans la hiérarchie entre CFP et Antenne/HR.

    Au passage c'est un peu déstabilisant toutes ces abbréviations, même si je ne doute pas qu'elles fassent partie du langage du domaine

    MAT.

  3. #3
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par Mat007
    Au passage c'est un peu déstabilisant toutes ces abbréviations, même si je ne doute pas qu'elles fassent partie du langage du domaine

    MAT.
    Oui, mais j'avais oublié de joindre le diagramme, ça t'aidait pas aussi !!!!
    Ca fait parti du domaine, mais c'est mieux avec un diagramme des classes!!

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Ok donc non, en effet, je n'avais pas saisi que HR est un LPT (comme dans is a)...

    Dans ce genre de situation la solution est souvent de mettre toutes les classes filles au même niveau, dans un premier temps en dupliquant les méthodes identiques, puis tout de suite après de factoriser les traitements communs petit à petit dans de nouvelles classes (éventuellement abstraites mais c'est pas obligé) juste au-dessus des classes filles qui dupliquent.
    Au final il y a l'interface commune tout en haut et les classes filles tout en bas, et au milieu des classes dont le but est de factoriser les implémentations communes des classes filles.
    La grosse difficulté consiste à trouver des noms adéquates pour toutes ces classes, c'est parfois loin d'être trivial !

    MAT.

  5. #5
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Euh.. je vois bien ce que tu veux dire MAT, mais ma modélisation me plaît là car elle reflète vraiment la physique qui est derrière. On peut pas dire que ce soit grave de s'en éloigner, m'enfin bon...

    Le truc qui est franchement bizarre dans mon cas ici, c'est que HR et Antenne ont vraiment le même type de comportement pour cette "méthode", alors que LPT n'a pas le même. De plus, HR est vraiment une partie de LPT!!!!
    J'espère que vous me comprenez !

    Donc je sèche un peu là...

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Citation Envoyé par poukill
    De plus, HR est vraiment une partie de LPT!!!!
    L'héritage a un sens très précis qui n'est a priori pas celui-ci si j'ai bien compris.
    Si HR dérive de LPT c'est que HR est un LPT, dans le sens où partout où on utilise/parle de LPT on pourrait mettre un HR à la place.

    Au fait ça signifie quoi LPT et HR ?

    MAT.

  7. #7
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    HR est bien un LPT !!!!!!!!!!!!!!!!

    Bon, je m'explique un peu plus pour que tu me comprennes!

    CFP = Composants Face au Plasma... Ce sont des composants physiques qui sont au contact du plasma. Cette classe générique n'est donc pas instanciable et tant mieux, les classes filles seront des composants précis à étudier...

    Antenne = Une antenne de chauffage. Elle est surveillé par une caméra infrarouge

    LPT = un composant de protection... Il ne ressemble pas du tout à une antenne. IL est aussi surveillé par une caméra infrarouge...
    MAIS l'image infrarouge est constitué en deux images, deux parties différentes de LPT, l'un au dessus de l'autre... Les traitements ne doivent tenir compte que d'une seule partie de cette image, et c'est ce qui pose problème...

    HR = Haute résolution. Abrévation de LPT HR, c'est la "moitié" du LPT observé par une caméra infrarouge plus performante encore. L'image infrarouge est constitué d'une seule image qui regarde en fait la moitié de ce que regarde le LPT...


    Au final, HR est bien un LPT (même composant, même traitement à effectuer dessus). mais HR, comme Antenne ne possède qu'une seule image, contrairement au LPT!!!

    Je persiste et je signe: ma modélisation est bonne, il y a juste ce setImageReferenceIR() qui est le même pour HR et Antenne (et c'est logique!)...
    Mais je répère, c'est la seule fonction membre qui pose problème, pour le reste des traitements, HR se comportera vraiment comme LPT!

    Merci pour ton aide MAT!

  8. #8
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Pour ce genre de problème, tu peux jeter un coup d'oeil sur le pattern "template method".

    edit: correction, nos messages se sont croisés
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  9. #9
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par r0d
    Pour ce genre de problème, tu peux jeter un coup d'oeil sur le pattern "template method".

    edit: correction, nos messages se sont croisés
    Je vais jeter un coup d'oeil... merci!

  10. #10
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    OK j'ai parcouru le forum et y ai trouvé plein de trucs intéressants...

    Seulement, voilà. J'ai un gros doute sur un truc. Ca va peut-être paraître évident pour vous, mais bon...

    La classe Mère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Mere {
    public:
    	Mere();
    	void fonction();
    
    	virtual void setImageReferenceIR() = 0;
    };
    
    void Mere::fonction()
    {
    	setImageReferenceIR();
    }
    La classe Fille1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Fille1 : public Mere{
    public:
    	Fille1();
    	virtual void setImageReferenceIR();
    };
     
    void Fille1::setImageReferenceIR()
    {
    	//implémentation de la fonction qui va bien
    }
    La classe Fille2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Fille2 : public Mere{
    public:
    	Fille2();
    	virtual void setImageReferenceIR();
    };
     
    void Fille2::setImageReferenceIR()
    {
    	//implémentation de la fonction qui va bien
    }
    C'est un ECM qui reproduit parfaitement mon problème: est ce que ce code est correct (ligne en rouge)??? Le polymorphisme permet-il celà?
    Est-ce que ce code produit ce que je veux, i.e le programme choisit en fonction du contexte la fonction membre de fille1 ou bien de fille2 ?????

    Merci beaucoup pour votre aide...

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Le code serait correct si les filles étaient déclarées comme héritant de la classe Mère...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par Médinoc
    Le code serait correct si les filles étaient déclarées comme héritant de la classe Mère...
    Corrigé!

    Hum, ça veut dire que je n'ai pas besoin du pattern template method en fait?

  13. #13
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par poukill
    C'est un ECM qui reproduit parfaitement mon problème: est ce que ce code est correct (ligne en rouge)??? Le polymorphisme permet-il celà?

    Est-ce que ce code produit ce que je veux, i.e le programme choisit en fonction du contexte la fonction membre de fille1 ou bien de fille2 ?????
    Oui... Sauf pendant l'exécution de constructeurs et de destructeurs: le type dynamique est alors considéré comme étant le type statique et il n'y a alors pas de dispatch.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  14. #14
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Oui... Sauf pendant l'execution de constructeurs et de destructeurs, le type dynamique est considere comme etant le type statique. Donc il n'y a alors pas de dispatch.
    Alors mon problèmes est !!! ^^

    Merci à vous tous, comme d'habitude !

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

Discussions similaires

  1. Trouvez une erreur de conception dans un code
    Par ultimate_manx dans le forum C
    Réponses: 11
    Dernier message: 02/05/2007, 22h37
  2. C++Builder fait une erreur de calcul
    Par gandf dans le forum C++Builder
    Réponses: 7
    Dernier message: 03/01/2004, 22h27
  3. [VB6] Source D'une erreur
    Par krest dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 16/07/2003, 17h33
  4. [procédure PG] Une erreur mystérieuse...ou pas
    Par doohan dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 09/07/2003, 17h16
  5. Ne pas formater une erreur
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 2
    Dernier message: 18/03/2003, 14h13

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