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 :

Appel fonction par nom


Sujet :

C#

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Points : 109
    Points
    109
    Par défaut Appel fonction par nom
    Bonjour,

    Dans mon programme, ma classe possède un attribut que j'ai appelé "enfant" de type object, qui peut ensuite prendre comme valeur une instance de l'une de mes trentaines de classes... J'explique :

    J'ai une ComboBox qui pointe sur une table SQL. Selon la sélection, la classe attribué à mon objet enfant peut varier :

    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
    switch(maComboBox.selectedItem.id)
    {
       case 1:
          enfant = new classe1();
          break;
       case 2:
          enfant = new classe2();
          break;
       case 3:
          enfant = new classe3();
          break;
       case 4:
          enfant = new classe4();
          break;
          .
          .
          .
       case 30:
          enfant = new classe30();
          break;
    }
    Ma question c'est : Sachant que toutes mes classes possèdent une méthode "maMethode()", comment pourrais-je lancer cette méthode plus tard dans mon programme? Je peux faire un switch, avec un cast dans chaque case... Mais ça ne sera pas beau... Existe-t-il une autre solution?? Y a-t-il moyen de l'appeler par son nom, un truc qui ressemble à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    enfant.getMethod("maMethode")
    ou
    enfant.callMethode("maMethode")
    Merci d'avance.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Tu crées une interface qui déclare cette méthode, et tu implémentes l'interface dans toutes tes classes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    interface IEnfant
    {
        void MaMethode();
    }
     
    class MaClasseEnfant1 : IEnfant
    {
        public void MaMethode()
        {
            ...
        }
    }
    Ensuite tu déclares enfant comme étant de type IEnfant plutôt que object, et tu appelles enfant.MaMethode().

    Si l'implémentation est la même dans beaucoup de classes "enfants", tu peux éventuellement créer une classe de base abstraite avec une implémentation commune de MaMethode

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Points : 109
    Points
    109
    Par défaut
    Bonjour tomlev et merci pour ta réponse immédiate,

    J'ai pensé à cette solution, mais la structure de mon programme ne me permet pas de le faire : Mes classes class1, class2... class3 héritent d'une autre classe héritant elle même d'une interface que je peux pas modifier...!

    Merci encore une fois, mais as tu une autre proposition? un cast dynamique par exemple? J'ai trouvé une réponse sur le forum msdn, mais je n'arrive pas à la comprendre, ni l'exploiter.
    A solution for this would be the use of a generic method that is invoked by reflection. To cast the object obj to type t:

    public static T Cast<T>(object o)
    {
    return (T)o;
    }

    Then invoke this using reflection:

    MethodInfo castMethod = this.GetType().GetMethod("Cast").MakeGenericMethod(t);
    object castedObject = castMethod.Invoke(null, new object[] { obj });
    Ref : http://social.msdn.microsoft.com/Forums/e...4f98-851d-ce3c8663cd79/

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 180
    Points : 4 496
    Points
    4 496
    Par défaut
    Tu peux ajouter plusieurs interfaces donc je vois pas ce qui t'empeche de le faire

    et si tu n'as pas accès à une des classe :
    tu peux soit hériter de celle-ci, soit l'encapsuler

    Utilisé la reflection c'est lourd en resources donc je ne pense pas que se soit la meilleurs solution
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par farfouch00 Voir le message
    J'ai pensé à cette solution, mais la structure de mon programme ne me permet pas de le faire : Mes classes class1, class2... class3 héritent d'une autre classe héritant elle même d'une interface que je peux pas modifier...!
    Et alors ? Tu ne peux pas hériter de plusieurs classes, mais rien ne t'empêche d'implémenter plusieurs interfaces...

    Et au fait, la méthode que tu veux appeler, elle ne serait pas déjà définie dans la classe de base dont tes classes héritent ?

    Citation Envoyé par farfouch00 Voir le message
    un cast dynamique par exemple? J'ai trouvé une réponse sur le forum msdn, mais je n'arrive pas à la comprendre, ni l'exploiter.


    Ref : http://social.msdn.microsoft.com/Forums/e...4f98-851d-ce3c8663cd79/
    Cette solution ne sert strictement à rien, elle ne résout rien du tout : l'intérêt d'un cast est de dire au compilateur "je sais que cet objet est de type T, laisse moi accéder statiquement aux membres de T sur cet objet". Mais là, après ce "cast dynamique", c'est toujours un object que tu manipules, tu ne connais toujours pas statiquement son type, donc tu n'es pas plus avancé qu'avant...

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Points : 109
    Points
    109
    Par défaut
    Merci les gars. Je m'en sors

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

Discussions similaires

  1. Bouton appel fonction par rapport à résultat
    Par Invité dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 25/03/2011, 18h43
  2. Réponses: 3
    Dernier message: 17/09/2008, 21h15
  3. Erreur sur appel fonction par Input/onclick
    Par heberco dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 05/09/2008, 18h46
  4. [PHP-JS] appel fonction par bouton
    Par dimi2 dans le forum Langage
    Réponses: 16
    Dernier message: 01/07/2008, 19h30
  5. [VB.Net] Problème appel fonction par un bouton
    Par balibo dans le forum ASP.NET
    Réponses: 4
    Dernier message: 25/11/2005, 10h48

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