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 :

Imposer une classe qui implemente une interface


Sujet :

C#

  1. #1
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut Imposer une classe qui implemente une interface
    Bonjour,

    J'ai plusieurs classes A1, A2, A3 qui etendent une classe A

    Je veux faire des classes B1, B2, B3 qui etendent A1, A2, A3 en implementant en plus une interface B.

    Mon probleme, c'est que j'aimerai avoir un type "etend A et implemente B" afin de pouvoir utiliser mes objets B1, B2, B3 de maniere générique. Y a t il un moyen en csharp de faire ca ?

    Merci

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    C'est franchement pas clair avec des A,B,C donne plutôt les vrais noms d'objets sinon cela n'a aucun sens.

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Points : 766
    Points
    766
    Par défaut
    Tu peux pas faire te faire une interface ITruc que tes classes de base A et B l'implémenteraient?

    Ainsi tout ce qui va hérité de tes classes A et B vont être accessible avec l'interface ITruc ?

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    Quand dans le forum d'à côté on parle qu'un héritage correct qui ne nuit pas à la conception se fait sur la sémantique ici on parle de faire hériter A de B et implémenter un truc

  5. #5
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Grosso modo, ce que je voudrais, c'est implementer des controls auquels j'ajouterais des fonctionnalités.
    On aura donc, par exemple :
    Composant
    -> Bouton
    -> Edit

    Je veux donc etendre la classe bouton et la classe edit. Au passage, j'aimerai que les nouveaux implementent aussi une interface "Actionneur" qui definierai une methode init et une methode action.

    Et pour pouvoir les utiliser dans une fonction generique, j'aimerais pouvoir créer un type "Composant qui implémente Actionneur". Comme ca, je pourrais utiliser tous les composant que j'aurais créé ainsi que leurs fonctions correspondant à actionneur. Bien sur, je ne peux pas modifier la classe composant et lui faire implémenter mon interface puisqu'il s'agit d'une classe definie par le framework.

    Une idée ?

  6. #6
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    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
    interface IActionneur
    {
    void init();
    void actionner();
    }
     
    //pas sûr que se soit une bonne idée d'hériter d'un control standard (plutôt créer un user control ?)
    class MyEdit: IActionneur, Edit
    {
    void init(){}
    void actionner{}
    }
     
     
    class GenericClass
    {
       public void FaireQuelquechose(IActionneur actionneur) {}
    }
    un truc comme cela pour commencer ? Y'a peut-être d'autres solutions que l'héritage notamment en passant par les méthodes d'extension ou alors en faisant une composition.

  7. #7
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    C'etait surtout pour savoir.

    Au final, je pense que je vais ajouter une methode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Component getComponent();
    qui se contentera d'un simple return this;

    Mais bon, c'est dommage, j'aurais bien aimé savoir si c'etait possible de declarer un type "Composant qui implémente Actionneur".

    a+

  8. #8
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    Citation Envoyé par hwoarang Voir le message
    Mais bon, c'est dommage, j'aurais bien aimé savoir si c'etait possible de declarer un type "Composant qui implémente Actionneur".
    Je t'aiderais bien mais impossible de comprendre ce qu'est un type "composant qui implémente un actionneur", essaie t'éclaircir un peu les choses la dessus en faisant un petit dessin par exemple.

  9. #9
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par hwoarang Voir le message
    Mais bon, c'est dommage, j'aurais bien aimé savoir si c'etait possible de declarer un type "Composant qui implémente Actionneur".
    Si ce que tu veux c'est donner à une méthode un objet de type Component et Actionner (au passage je te recommande préfixer les interfaces par I, c'est l'usage en .Net), tu peux rendre la méthode générique et lui ajouter une contrainte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void Bidule<T>(T obj) where T : Component, IActionneur
    {
    }
    Par contre si c'est une à variable membre ou à une propriété que tu veux donner ce type, c'est pas possible.

    T'as l'air de bosser sur de l'UI ? C'est vrai que pas mal de composants ont des propriétés similaires (même nom même type) sans pour autant hériter d'une même classe commune. Le duck-typing a ses adeptes, mais personnellement j'ai toujours pu m'en passer.

  10. #10
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Si ce que tu veux c'est donner à une méthode un objet de type Component et Actionner (au passage je te recommande préfixer les interfaces par I, c'est l'usage en .Net), tu peux rendre la méthode générique et lui ajouter une contrainte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void Bidule<T>(T obj) where T : Component, IActionneur
    {
    }
    J'avais regardé du coté des templates mais ce n'est pas ce que je cherche.

    Citation Envoyé par Guulh Voir le message
    au passage je te recommande préfixer les interfaces par I, c'est l'usage en .Net
    C'est ce que je fais. L'interface actionneur n'etait que pour l'exemple. Cela dit, ca gagne à etre rappelé. D'ailleurs, si tu connais un site qui repertorie les conventions d'usage, notamment sur le nommage des fonctions et variables, je suis preneur

    Citation Envoyé par Guulh Voir le message
    Par contre si c'est une à variable membre ou à une propriété que tu veux donner ce type, c'est pas possible.
    Visiblement, tu as bien compris ce que je veux faire. Malheureusement, tu confirmes l'impression que j'avais.

    Citation Envoyé par Guulh Voir le message
    T'as l'air de bosser sur de l'UI ? C'est vrai que pas mal de composants ont des propriétés similaires (même nom même type) sans pour autant hériter d'une même classe commune
    Ceux qui m'interessent heritent d'une classe commune. Je trouve ca dommage qu'on ne puisse pas typer de cette maniere parce que ca ressemble beaucoup à un simple template et à priori, je ne vois pas de contre indication...

    Citation Envoyé par Guulh Voir le message
    Le duck-typing a ses adeptes, mais personnellement j'ai toujours pu m'en passer.
    C'est interessant ca. Mais bon, je vais quand meme essayer de m'en passer

  11. #11
    Membre actif Avatar de gdkenny
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 251
    Points : 248
    Points
    248
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Par contre si c'est une à variable membre ou à une propriété que tu veux donner ce type, c'est pas possible.
    Rien n'empêche, dans une classe générique, d'avoir une propriété ou un champ du type générique ouvert:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Classeg<T> : ClasseBase where T : IContrainte
        {
            #region Private Fields
     
            private T _Component;
     
            #endregion
        }

  12. #12
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par hwoarang Voir le message
    J'avais regardé du coté des templates mais ce n'est pas ce que je cherche.
    Juste, qu'on soit bien d'accord: les template au sens C++ (c'est à dire, pour schématiser, des espèces de super-macros) n'existent pas en .Net. On parle ici de generics.

    Comme le dit gdkenny, si en fait tu as besoin de ce type "Component + IActionneur" pour en faire une variable membre d'une classe, tu peux créer un type generic avec une contrainte sur T. Si t'as juste une / plusieurs méthodes qui manipulent ce type, la solution que je te suggérais suffit. Et en complément, comme le disait hegros, si les méthodes prenant une instance de ce type en paramètre sont statiques, tu peux en faire des méthodes d'extension.

    Voilà pour la théorie.

    Mais concrètement, ayant pas mal bossé avec les windows forms, je vois pas trop pourquoi tu voudrais coller à tous les controls une méthode init et une méthode action. Ces contrôles héritent de la classe Control, qui continent déjà pas mal de méthodes, dont certaines surchargeables, qui devraient te suffire sans tout rendre aussi complexe.
    Ce que je veux dire, c'est qu'une librairie comme les windows forms est conçue d'une certaine façon, que l'on peut apprécier ou décrier, mais à laquelle il vaut mieux se plier plutôt qu'essayer de la surcharger plus que nécessaire.

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/12/2014, 16h25
  2. éxecuter une classe qui contient une classe annonyme
    Par star-watcher dans le forum Débuter avec Java
    Réponses: 9
    Dernier message: 09/03/2009, 01h26
  3. Réponses: 1
    Dernier message: 26/02/2009, 15h38
  4. Réponses: 27
    Dernier message: 03/01/2008, 11h07
  5. [REFLEXION] Connaitre toutes les classes qui implémentent une interface
    Par narmataru dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 25/10/2006, 11h00

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