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 :

[C#] Heritage multiple -> comment faire autrement


Sujet :

Windows Forms

  1. #1
    Membre du Club Avatar de schnourf
    Inscrit en
    Mars 2003
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 66
    Points : 43
    Points
    43
    Par défaut [C#] Heritage multiple -> comment faire autrement
    Bonjour,

    j'ai une application pour laquelle je doit faire quelques controles personalisés (TextBox, ComboBox etc... environ 15) que je creer de la maniere suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public class MaTextBox : TextBox
    { ..... }
    Pour chacun de ces controles je doit rajouter une prorietes, override le onPaint et rajouter des methodes ou fonctions.
    Donc je pensait creer une classe de base
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    internal MaClasse : Control 
    {
     protected override OnPaint (...) { }
     enum {...}
    }
    puis de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public class MaTextBox : TextBox, MaClasse
    { ..... }
    mais ceci ne marche pas vu que l'heritage multiple n'est pas supporté par c#
    Comme tout mes controles perso contiendront le meme code et pour eviter d'avoir a reecrire 50 fois le meme code (c qui n'est pas bien en cas de modif) je voulais savoir s'il existait une facon de contourner ceci.

    Merci

  2. #2
    Membre confirmé Avatar de Jabbal'H
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 403
    Points : 580
    Points
    580
    Par défaut
    Je crois que la seule manière "d'émuler" un héritage multiple est de faire des interfaces, meme si c'est pas vraiment pareil, tu peux implémenter autant d'interface que tu veux.

  3. #3
    En attente de confirmation mail
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Points : 669
    Points
    669
    Par défaut
    Bonjour,

    Tu peux tout aussi bien sortir tes méthodes communes dans un module.
    Cela t'évitera de répéter 15 fois les mêmes méthodes.

    Jabbal'H :
    Tu ne peux pas créer de méthode dans une interface, tu ne peux que les déclarer. Ca ne changera rien au fait qu'il devra se farcir 15 fois la même méthode.

  4. #4
    Membre du Club Avatar de schnourf
    Inscrit en
    Mars 2003
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 66
    Points : 43
    Points
    43
    Par défaut
    Tu peux tout aussi bien sortir tes méthodes communes dans un module.
    J'y avais aussi penser entre temps, c vrai mais pour faire un enum faudra quand meme que je le mette dans chaque classe non ?

    et faire une classe qui herite de windows.forms c'est possible ???

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Salut,

    oui tu peux hériter de windows form, aucun pb mais a mon avis dans ton cas c'est plutot usercontrol ou control qui t'interressera.

    Concernant l'implémentation de l'héritage multiple:
    - fait hériter tes controls de la mm classe de base
    - crèe des interfaces sur ce que tu ne peux pas mettre dans ta classe de base
    - une autre méthode consiste à créer une classe contenant les méthodes qui tinteresse et créer une interface qui oblige les control à implémenter une propriété du type de la classe en question

  6. #6
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    Mise à part le langage, ca ne pose pas de probleme dans l'heritage multiple que TextBox et MaClasse heritent tous les deux de Control ? Ok c'est possible mais je ne pense pas que c'est une tres bonne idee. Je crois qu'il existe un pattern pour resoudre ce type de conflit, il faut que je creuse un peu. Je n'ai pas l'idée à l'instant

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 15
    Points : 18
    Points
    18
    Par défaut :d
    MS propose pour les concepteurs de composant web ou Windows, 3 approches :
    Control dérivé, Control composite, control from scratch.
    Et ton approche ne peut pas être classée parmi l’une des approches précédemment mentionnées. Donc déjà c’est un souci !!
    hérité d’un control (TextBox)et personnalisé le comportement ca résout le problème mais là tu es amené à écrire tous comportements commun dans chacun de tes controls !
    Il faut dire aussi que c’est un la faute de langage, vue qu’il supporte pas l’implementation implicite des interface (http://martinfowler.com/bliki/Implic...mentation.html pour plus de détail)

    Et vive le Copier/ Coller

  8. #8
    En attente de confirmation mail
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Points : 669
    Points
    669
    Par défaut
    Bonjour,

    J'y avais aussi penser entre temps, c vrai mais pour faire un enum faudra quand meme que je le mette dans chaque classe non ?
    tu peux tout aussi bien ne le déclarer qu'une seule fois dans un module.

    et faire une classe qui herite de windows.forms c'est possible ???
    Windows.Forms est un namespace, pas une classe...

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par schnourf
    Comme tout mes controles perso contiendront le meme code et pour eviter d'avoir a reecrire 50 fois le meme code (c qui n'est pas bien en cas de modif) je voulais savoir s'il existait une facon de contourner ceci.
    Il y a l'héritage, mais il y a aussi la composition. Si tu ne peux pas faire ce que tu veux par héritage, tu le fais par composition. Et même si tu peux faire ce que tu veux par héritage, c'est pas impossible que ce soit quand même mieux pas composition

    L'inconvénient de la composition est que tu dois mettre le même code de délégation dans chaque classe. L'avantage est que ça tient en une ligne par méthode et que tu peux composer autant de classes que tu veux. Et que c'est plus testable, mais là c'est presque un autre sujet

    Citation Envoyé par schnourf
    J'y avais aussi penser entre temps, c vrai mais pour faire un enum faudra quand meme que je le mette dans chaque classe non ?

    et faire une classe qui herite de windows.forms c'est possible ???
    Un Enum est une classe comme les autres (juste un poil plus limitée . Tu peux la mettre dans un namespace et la référencer comme n'importe quelle classe.

  10. #10
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut Une solution intéressante
    http://www.codeproject.com/cs/design/smip.asp
    Une pattern.
    C'est en anglais. Si besoin, je résume.

  11. #11
    Membre confirmé Avatar de Jabbal'H
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 403
    Points : 580
    Points
    580
    Par défaut
    Euh question bete mais c'est quoi la composition ?

  12. #12
    En attente de confirmation mail
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Points : 669
    Points
    669
    Par défaut
    Bien vu ! Mose

    Merci de nous avoir dénicher ce lien

  13. #13
    Membre du Club Avatar de schnourf
    Inscrit en
    Mars 2003
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 66
    Points : 43
    Points
    43
    Par défaut
    Merci beaucoup Mose, ça m'a beaucoup aidé. Le fait que ce soit en anglais ne me pose pas de probleme. Je travaille dessus en ce moment.


    Euh question bete mais c'est quoi la composition ?
    D'apres mes souvenirs, par composition on entend qu'une classe A peut contenir un objet d'une autre classe B.
    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class A
    {
           public class B
           {..... }
     
           public A (...) {...}
     
           public B bobject;
    }

  14. #14
    Membre du Club Avatar de schnourf
    Inscrit en
    Mars 2003
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 66
    Points : 43
    Points
    43
    Par défaut
    Un grand merci a toi Mose, j'ai reussi a faire ce que je voulais.

    J'aurai encore une toute petite question .

    Je sais qu'il est possible de rajouter des propriétés pour un contrôle.
    Est-ce qu'il est possible aussi d'en desactiver ??

    Je m'explique j'ai rajouter une prpriétes "MonDesign" et si c a true j'aimerai qu'on ne puisse plus changer les propriétés Backcolor et Font. Et quand on selectionne False alors les proprietes sont de nouveau editables.

    Merci

  15. #15
    Membre du Club Avatar de schnourf
    Inscrit en
    Mars 2003
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 66
    Points : 43
    Points
    43
    Par défaut
    C'est bon pour ma derniere questin j'ai fait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public override Color BackColor
    et puis j'ai reecrit la methode set.

    Merci pour tout, mes controles fonctionnent comme je le voulais

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

Discussions similaires

  1. [Débutant] Héritage multiple comment faire autrement
    Par shaun_the_sheep dans le forum C#
    Réponses: 7
    Dernier message: 26/09/2013, 10h35
  2. Réponses: 2
    Dernier message: 29/01/2008, 21h15
  3. comment faire autrement ? pb compatibilité
    Par tavarlindar dans le forum Requêtes
    Réponses: 4
    Dernier message: 26/04/2007, 10h38
  4. [PL/SQL] [9i] Comment faire autrement ?
    Par ftrifiro dans le forum Oracle
    Réponses: 4
    Dernier message: 23/03/2006, 15h36
  5. Script qui s'arrète !! Comment faire autrement ?
    Par Xplosif² dans le forum C++
    Réponses: 5
    Dernier message: 25/02/2006, 23h10

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