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 :

appeler la bonne classe enfant


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 45
    Points : 24
    Points
    24
    Par défaut appeler la bonne classe enfant
    Bonjour,

    Je suis débutant en C# et je travaille actuellement sur un projet web ASP.NET/C#.
    Je voudrais "normer" les classes métier en créant une classe AbstractMetier.cs avec des méthodes à implémenter.Cette classe contiendrait une méthode execute qui factorise le comportement commun des différentes classes metier.

    Cette méthode execute fait appel à d'autres méthodes qui devront etre implementer par la classe metier.

    Et c'est là le problème que j'ai. Voici un bout de code dans ma classe abstraite.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public static IData ExecuteService(IData input, string module, string cc)
        {
               ........
                   IData InstanceData = new Data("data");
    
            //Valorisation du message LTNV 
    
            PopulateInputService(cce, DataEntre, input);
    
            //Ajout des noeuds pour l'envoie du message 
    ................
    }
    public abstract void PopulateInputService(string cc, string DataEntre, string input);
    J'ai cette erreur à la compile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Error	2	An object reference is required for the nonstatic field, method, or property 'AbstractMetier.PopulateInputService(string, string, string)'
    La méthode n'étant pas static (elle doit etre abstract), il faut referencer un objet pour faire un appel à la méthode.

    J'aimerais savoir s'il existe une manière de récuperer la classe qui appelle la méthode et de l'instancier (en gros de faire appel à un objet de la bonne classe enfant)?

    Je sais pas si je me suis exprimé clairement mais si ce n'est pas le cas n'hésitez pas à me poser des questions.

    Merci d'avance.

  2. #2
    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
    Les fonction statiques sont "hors" de l'héritage. je ne sais pas comment le dire mieux, mais étant donné qu'elles ne peuvent pas appeler des fonctions d'instance, elles sont complètement étrangères à abstract / virtual / override / etc.

    Ta fonction ExecuteService n'a accès qu'aux propriétés et méthodes statiques publiques des autres classes et aux propriétés et méthodes statiques de ta classe.

    Voilà

    Donc : pourquoi veux tu que cette méthode soit statique ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Les fonction statiques sont "hors" de l'héritage. je ne sais pas comment le dire mieux, mais étant donné qu'elles ne peuvent pas appeler des fonctions d'instance, elles sont complètement étrangères à abstract / virtual / override / etc.

    Ta fonction ExecuteService n'a accès qu'aux propriétés et méthodes statiques publiques des autres classes et aux propriétés et méthodes statiques de ta classe.

    Voilà

    Donc : pourquoi veux tu que cette méthode soit statique ?
    En fait pour shematiser, je voudrais que la classe parente A ait une méthode executeService qui fasse appel à une voire plusieurs méthodes, dont populateInputService.
    Les méthodes appelées par executeService seraient à coder dans la classe fils. Cela permettrait aux classes enfants de comporter uniquement ces 3 méthodes qui sont spécifiques.

    Tu vois ce que je veux dire?

  4. #4
    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
    Je comprends bien, j'ai déjà rencontré des soucis similaires Mais je réitère ma question : pourquoi veux-tu que cette méthode soit statique ? Ce concept est fondamentalement étranger à l'héritage, à l'abstraction, au virtuel.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Je comprends bien, j'ai déjà rencontré des soucis similaires Mais je réitère ma question : pourquoi veux-tu que cette méthode soit statique ? Ce concept est fondamentalement étranger à l'héritage, à l'abstraction, au virtuel.
    Je ne veux pas spécialement qu'elle soit statique, je disais cela car c'est le message d'erreur que j'avais. En fait je veux juste que lorsque au niveau de ma classe controleur j'appelle ExecuteService(), cette méthode dans la classe abstraite puisse appeler la méthode de la classe enfant mais je ne sais pas comment faire.

  6. #6
    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 michael08 Voir le message
    Je ne veux pas spécialement qu'elle soit statique, je disais cela car c'est le message d'erreur que j'avais. En fait je veux juste que lorsque au niveau de ma classe controleur j'appelle ExecuteService(), cette méthode dans la classe abstraite puisse appeler la méthode de la classe enfant mais je ne sais pas comment faire.
    Comme le message d'erreur l'indique, ça ne marche pas parce que ta méthode est statique. Enlève ce mot clé et à toi les joies de l'héritage et des méthodes virtuelles.

  7. #7
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Points : 706
    Points
    706
    Par défaut
    Bonsoir,

    Citation Envoyé par michael08 Voir le message
    Les méthodes appelées par executeService seraient à coder dans la classe fils. Cela permettrait aux classes enfants de comporter uniquement ces 3 méthodes qui sont spécifiques.
    D'après ce que j'ai lu, tu veux un comportement polymorphique pour ta méthode executeService.

    Tu ne peux peux pas utiliser une méthode statique d'une part parce que les mot clés abstract, virtual et override sont incompatibles car un membre statique fonctionne différemment des membres d'instance.
    D'autre part parce qu'une méthode statique ne peut utiliser QUE des membres statiques donc impossibilité d'appeler une méthode virtuelle.

    Je vais te montrer un exemple représentatif de ce que tu souhaite faire
    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
     
    public abstract class AbstractMetier
    {
       public abstract ExecuteService();
     
       public IData ExecuteService(IData input, string module, string cc)
       {
               ........
                   IData InstanceData = new Data("data");
     
            //Ajout des noeuds pour l'envoie du message 
           ................
          }
    }
     
    public class Metier : AbstractMetier
    {
         public override ExecuteService()
         {
             //contenu spécifique de la méthode pour la class Metier
         }
    }
     
    public class Metier2 : AbstractMetier
    {
         public override ExecuteService()
         {
             //contenu spécifique de la méthode pour la class Metier2
         }
    }
    Tu utilise la même méthode que ExecuteService() avec ta méthode PopulateInputService.

    Par contre la classe AbstractMetier n'est PAS instanciable donc il faut se répertcuter sur les classe filles donc tu dois instancier ta classe Metier ou une classe fille de AbstractMetier pour que cela puisse fonctionner. Tu as 2 choix:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AbstractMetier metier = new Metier();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Metier metier = new Metier();
    Ici la méthode IData ExecuteService de la classe Mère exécutera la méthode ExecuteService de la classe fille c'est ce que tu veux non ?

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par harz62 Voir le message
    Bonsoir,


    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
     
    public abstract class AbstractMetier
    {
       public abstract ExecuteService();
     
       public IData ExecuteService(IData input, string module, string cc)
       {
               ........
                   IData InstanceData = new Data("data");
     
            //Ajout des noeuds pour l'envoie du message 
           ................
          }
    }
     
    public class Metier : AbstractMetier
    {
         public override ExecuteService()
         {
             //contenu spécifique de la méthode pour la class Metier
         }
    }
     
    public class Metier2 : AbstractMetier
    {
         public override ExecuteService()
         {
             //contenu spécifique de la méthode pour la class Metier2
         }
    }

    [/CODE]

    Ici la méthode IData ExecuteService de la classe Mère exécutera la méthode ExecuteService de la classe fille c'est ce que tu veux non ?
    Pas vraiment. En fait je désire que ExecuteService() ne soit codé que dans la classe abstraite mais que PopulateInputService() soit implementé par les classes fils.
    Ainsi dans la classe controleur, on appelle la méthode ExecuteService de la classe fils, ce sera donc celle de la classe parente qui sera appelée. Ensuite, la méthode ExecuteService() fera appel à PopulateInputService() et c'est la méthode de la classe fils qui doit etre appelé dans ce cas vue que la classe abstraite ne contient que sa signature.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Comme le message d'erreur l'indique, ça ne marche pas parce que ta méthode est statique. Enlève ce mot clé et à toi les joies de l'héritage et des méthodes virtuelles.
    Oui mais je n'ai pas mis le mot clé static ,et donc la méthode est inaccessible.

    En fait, ExecuteService(), qui n'est pas implémentée dans les classes fils, appelle PopulateInputService() qui elle est déclaré dans la classe abstraite et implémentée dans la classe fils.

    Donc dans AbstractMetier.ExecuteService() il faut passer une réference pour appeler la méthode de la classe fils.
    Et c'est là le problème: on passe une réference sur quelle classe enfant?
    Y a t il une manière de réferencer dynamiquement une classe?

  10. #10
    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 michael08 Voir le message
    Oui mais je n'ai pas mis le mot clé static ,et donc la méthode est inaccessible.
    Comprends pas. J'ai l'impression que tu ne vois pas bien ce que static veut dire. Soit une classe Bidule, et b une instance de Bidule (créée par exemple par Bidule b = new Bidule()), et f une fonction de la classe Bidule :
    - si f est une méthode statique, tu peux faire Bidule.f()
    - si c'est une méthode d'instance (95% des cas), c'est b.f() qu'il faut faire.

    Pour l'héritage :
    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
    abstract class Mere
    {
      public void Execute()
      {
        // ...
        this.PopulateInputService();
        // ...
      }
      public abstract void PopulateInputService();
    }
    class Fille : Mere
    {
      public override void PopulateInputService()
      {
        // ... du code
      }
    }
     
    Fille f = new Fille(); // ou bien Mere f = new Fille();
    f.Execute(); // appellera PopulateInputService de la fille car f est une Fille
    Donc dans AbstractMetier.ExecuteService() il faut passer une réference pour appeler la méthode de la classe fils.
    Non, ça se fait comme je l'ai écrit ci dessus, en définissant une classe abstraite, puis en surchargeant des méthodes dans des classes filles, qu'il faut instancier.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Comprends pas. J'ai l'impression que tu ne vois pas bien ce que static veut dire. Soit une classe Bidule, et b une instance de Bidule (créée par exemple par Bidule b = new Bidule()), et f une fonction de la classe Bidule :
    - si f est une méthode statique, tu peux faire Bidule.f()
    - si c'est une méthode d'instance (95% des cas), c'est b.f() qu'il faut faire.

    Pour l'héritage :
    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
    abstract class Mere
    {
      public void Execute()
      {
        // ...
        this.PopulateInputService();
        // ...
      }
      public abstract void PopulateInputService();
    }
    class Fille : Mere
    {
      public override void PopulateInputService()
      {
        // ... du code
      }
    }
     
    Fille f = new Fille(); // ou bien Mere f = new Fille();
    f.Execute(); // appellera PopulateInputService de la fille car f est une Fille
    Non, ça se fait comme je l'ai écrit ci dessus, en définissant une classe abstraite, puis en surchargeant des méthodes dans des classes filles, qu'il faut instancier.
    Oui en fait c'est vrai que je n'ai pas essayé d'utiliser le mot clé this pour la réference à l'objet courant.
    Je vais essayer (ça devrait marcher).

    Merci pour ta patience!

  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
    T'inquiète, t'es pas le seul que le concept de "static" perturbe

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/09/2012, 14h58
  2. Réponses: 10
    Dernier message: 18/03/2010, 17h40
  3. [java.lang.Class & arbre] tester la bonne class
    Par TabrisLeFol dans le forum Langage
    Réponses: 3
    Dernier message: 02/07/2005, 12h48
  4. [PL/SQL]Appel d'une classe/méthode java
    Par marsup54 dans le forum SQL
    Réponses: 4
    Dernier message: 30/06/2004, 16h44
  5. [MDI] comment fermer la bonne fenêtre enfant ?
    Par KThrax dans le forum Langage
    Réponses: 5
    Dernier message: 01/09/2002, 09h42

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