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 :

[Conception] Hiérarchie de classes et maintenance


Sujet :

C++

Vue hybride

olivier1978 [Conception] Hiérarchie de... 01/10/2007, 20h08
bolhrak Salut, Tu devrais regarder... 01/10/2007, 20h13
olivier1978 OK, merci, ça va me faire un... 01/10/2007, 20h25
bolhrak Vais anticiper alors ^^ En... 01/10/2007, 20h55
olivier1978 Merci, je vais regarder ça... 01/10/2007, 23h42
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Par défaut [Conception] Hiérarchie de classes et maintenance
    Bonjour à tous,

    J'ai un petit souci de conception. Pour faire simple, j'ai une classe mère d'objets géométriques GeometricShape, de laquelle dérivent plusieurs classes RectangleShape, SquareShape, ParallelogramShape ...
    Par ailleurs, j'ai une classe Profil et une classe Voisinage. Or, je voudrais que mes objets géométriques possèdent ces propriétés (avoir un ou des Profil, et / ou un voisinage). Si je fais ça par des dérivations, je vais avoir un paquet de classes, et je ne pense pas que ce soit une bonne solution. Je vais par exemple me retrouver avec RectangleShapeWithProfil, RectangleShapeWithNeighborhood, RectangleShapeWithProfilAndNeighborhood ... A la limite, c'est acceptable lorsque l'on a qu'une seule classe. Mais, je dois faire de même pour chaque sous classe de GeometricShape, et à chaque fois que je rajoute une "propriété", je dois me retaper un paquet de dérivations ...
    Je trouve que c'est très lourd, et je me dis qu'il doit y avoir une façon propre de faire ça, autrement que par des dérivations. Seulement, je ne sais pas comment faire.

    Pourriez vous m'aider ?

    D'avance merci

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Salut,

    Tu devrais regarder du côté du Design Pattern Decorator, il est parfaitement adapté à ton besoin

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Par défaut
    Citation Envoyé par bolhrak Voir le message
    Tu devrais regarder du côté du Design Pattern Decorator, il est parfaitement adapté à ton besoin
    OK, merci, ça va me faire un peu de lecture ... Je suis pas sûr de bien comprendre et je viendrais peut être t'embêter à nouveau si j'ai besoin de précisions.

    ++

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Vais anticiper alors ^^

    En gros le but de ce DP est de pouvoir enrichir les fonctionnalités d'une classe sans en dériver. Ca permet notamment d'ajouter les fonctionnalités d'une autre famille de classes à la première famille sans faire exploser le nombre de classes.

    Dans ton cas :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    class GeometricShape {
     
        public:
     
            virtual void operation1() =0;
            virtual void operation2() =0;
     
    };
     
    class GeometricShapeDecorator : public GeometricShape {
     
        public:
     
            GeometricShapeDecorator(GeometricShape* shape): p_shape(shape)
            {assert(p_shape!=0);}
     
            //Comportement par defaut : on délègue à l'élément wrappé
            virtual void operation1() {p_shape->operation1();}
            virtual void operation2() {p_shape->operation2();}
     
        protected:
     
            GeometricShape* p_shape;
     
    };
     
    class GeometricShapeWithProfil : public GeometricShape {
     
        public:
     
            //Constructeur à mettre
     
            //comportement redéfini
            virtual void operation1() {
                //Traitements spécifiques
                p_shape->operation1();
                //Traitements spécifiques
            };
     
    };
     
    //Utilisation :
     
    GeometricShape* p = new GeometricShapeWithProfil(new Rectangle());
    Bon il manque les destructeurs et deux trois petites choses mais globalement l'idée est là.

    Tu peux également ajouter de nouvelles méthodes dans tes Decorator, mais ça implique que tu conserves le type exact de ceux-ci lorsque tu les manipules.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Par défaut
    Merci, je vais regarder ça avec attention.
    En revanche, j'ai une petite question. N'est il pas possible d'arriver au même résultat en utilisant des nested templates comme par exemple dans la librairie de graphes de boost ?

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Si, il y a moyen de le faire également par template, je ne sais pas comment est implémentée boost.graph donc je sais pas trop si c'est le même principe.

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

Discussions similaires

  1. Hiérarchie de class et membres spécifiques
    Par bolhrak dans le forum C++
    Réponses: 6
    Dernier message: 23/10/2006, 13h23
  2. Réponses: 2
    Dernier message: 25/08/2006, 22h18
  3. [conception] vecteur de classes
    Par r0d dans le forum C++
    Réponses: 7
    Dernier message: 28/12/2005, 12h00
  4. [CONCEPTION] vector de classes heritées
    Par A-S-H dans le forum SL & STL
    Réponses: 9
    Dernier message: 28/12/2005, 09h50
  5. Conception d'une classe parente
    Par VincentB dans le forum Langage
    Réponses: 9
    Dernier message: 24/06/2003, 17h28

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