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

Windows Forms Discussion :

Polymorphisme et #define


Sujet :

Windows Forms

  1. #1
    Membre averti
    Inscrit en
    Septembre 2002
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 26
    Par défaut Polymorphisme et #define
    Bonjour,

    Je developpe une application dans laquelle je souhaite utiliser le polymorphisme pour la rendre utilisable sur plusieurs bases de données :

    ex. : j'écris une classe AbstractColis, ainsi qu'une classe MySqlColis et OracleColis en derivant. Lorsque j'instancie la classe je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AbstractColis monColis = new MySqlColis()
    , ainsi dans la suite du code je n'ai plus aucun spécifique lié à la base.

    Le probleme (enfin) : J'aurais aimé ecrire (si jétais en C)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define ColisBase() MySqlColis()
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define ColisBase() OracleColis()
    et dans le code utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AbstractColis monColis = new ColisBase()
    Ainsi de suite pour chaque constructeur, ce qui me permettait de passer d'une base à l'autre seulement par les define.
    => Comme les define en C# ne permettent pas de remplacer des chaines de caracteres par une autre comment puis-je faire ? (il y a surement une methode plus classique ...)

    Merci de votre aide.
    Florent

  2. #2
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Si tu me permets de donner mon avis, créer des oracleColis et des SqlColis est assez extraordinaire... Je ne reçois pas beaucoup de SqlColis dans ma boite aux lettre.

    Tout ça pour dire que conceptuellement, un colis est un colis, et ne dépend pas d'une base de données.
    Tu devrais séparer la logique base de données, de la logique métier. Dans ton cas, je partirais sur une approche de type Strategy (Design Pattern) : http://www.dofactory.com/Patterns/PatternStrategy.aspx
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  3. #3
    Membre Expert Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Par défaut
    Citation Envoyé par florent_g
    Je developpe une application dans laquelle je souhaite utiliser le polymorphisme pour la rendre utilisable sur plusieurs bases de données
    Ouais, bonne idée.
    Citation Envoyé par florent_g
    Lorsque j'instancie la classe je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AbstractColis monColis = new MySqlColis()
    , ainsi dans la suite du code je n'ai plus aucun spécifique lié à la base.
    Bein c'est normal, tu utilises le polymorphisme. Je pense que tu n'as pas compris la définition de ce mot...
    Citation Envoyé par florent_g
    J'aurais aimé ecrire (si jétais en C)
    #define ColisBase() MySqlColis()
    Ouais mais ça c'est pas du polymorphisme !

    Bref...1+ pour la solution de SaumonAgile.

  4. #4
    Membre averti
    Inscrit en
    Septembre 2002
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 26
    Par défaut
    Merci pour le lien précieux SaumonAgile,

    ça ressemble pas mal à ce que j'essayais de faire (excepté que les methodes abstraites etaient directement inclues dans la classe de base au lieu de les encapsuler dans une sous classe de l'objet ce qui je l'avoue était beaucoup moins propre.)

    Cependant, mon probleme reste entier, au moment de l'instantiation d'un objet il faut que je lui passe la classe concrete, ce qui correspond dans l'exemple de ton lien à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    studentRecords.SetSortStrategy(new QuickSort());
    Si je décide d'utiliser quicksort partout dans le programme (ce qui correspondrait à une base mysql par exemple chez moi), j'aimerais le 'définir' une fois pour toute pour ne pas avoir à faire des modifications à plusieurs endroits si je souhaite passer en 'shellshort' (base Oracle dans mon prog).

    Et c'est là que ça coince ...

    Florent.

  5. #5
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Dans ce cas, tu peux mettre un paramètre dans ton fichier de configuration et en fonction de ce paramètre, tu utilises l'un ou l'autre des méthodes héritant de sort() pour affecter la strategie de tes objets. On appelle ça un factory (c'est aussi un design pattern).
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  6. #6
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Par défaut
    Bonjour,

    Vous pouvez utiliser la reflection pour instancier vos classes concrètes à partir du nom de leur type.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Assembly Asm = ??? // soit l'assembly ou se trouve la classe TrèsGrosColis
     
    Type TypeConcret = Asm.GetType("TrèsGrosColis")
     
    AsbractClass colis = Activator.CreateInstance(TypeConcret) as AbstractClass //

  7. #7
    Membre averti
    Inscrit en
    Septembre 2002
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 26
    Par défaut
    C'est exactement ce que je recherchais !
    Merci pour votre aide à tous !

    Florent.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/07/2004, 23h24
  2. INSO Filter : "USER-defined exception" avec ctx_do
    Par Wiztiti dans le forum Oracle
    Réponses: 2
    Dernier message: 01/06/2004, 16h14
  3. USER DEFINE FONCTION : PB éxécution requête
    Par juelo dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 26/01/2004, 11h12
  4. Define sur plusieurs lignes
    Par Gogoye dans le forum C
    Réponses: 6
    Dernier message: 06/10/2003, 11h45
  5. define avec GCC.
    Par vagabon dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 12/06/2003, 14h04

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