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 :

problème de 2 classes B et C utilisent la classe A


Sujet :

C#

  1. #1
    Membre régulier
    Homme Profil pro
    étudiant
    Inscrit en
    Septembre 2011
    Messages
    342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 342
    Points : 124
    Points
    124
    Par défaut problème de 2 classes B et C utilisent la classe A
    Bonjour,

    j'ai une classe A utilisée par 2 autres classes B et C ,un clic sur un bouton sur ces 2 classes (B et C) envoi le client vers la classe A,existe t'il une méthode svp utilisée dans la classe A pour me signaler quel classe B ou C peut utiliser les ressources de A

    autrement,comment je peux déterminer l'événement provient de quel classe B ou C dans A

    et merci

  2. #2
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Par "envoi vers le client" j'imagine qu'il y a un appel de méthode.

    Donc le plus simple est de simplement passer en paramètre de cette méthode l'objet qui appelle.
    Si tu as peu d'objets tu peux aussi utiliser une valeur l'indiquant comme une enum.

    Si tu veux un truc plus chiadé tu peux utiliser des événements:
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    class A
    {
        public A(B b, C c)
        {
            b.SomethingHappened += b_SomethingHappened;
            c.SomethingHappened += c_SomethingHappened;
        }
     
        void b_SomethingHappened(object sender, EventArgs e)
        {
            Console.WriteLine("Called back from B.");
        }
     
        void c_SomethingHappened(object sender, EventArgs e)
        {
            Console.WriteLine("Called back from C.");
        }
    }
     
    class B
    {
        public event EventHandler SomethingHappened = delegate { };
     
        public void DoSomething()
        {
            SomethingHappened(this, EventArgs.Empty);
        }
    }
     
    class C
    {
        public event EventHandler SomethingHappened = delegate { };
     
        public void DoSomething()
        {
            SomethingHappened(this, EventArgs.Empty);
        }
    }
     
    class Program
    {
        static void Main(string[] args)
        {
            B b = new B();
            C c = new C();
     
            A a = new A(b, c);
     
            b.DoSomething();
            c.DoSomething();
        }
    }
    Si tu as des singletons, i.e. une seule instance de B et C, tu peux simplifier en utilisant des évènements static:
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    class A
    {
        public A()
        {
            B.SomethingHappened += B_SomethingHappened;
            C.SomethingHappened += C_SomethingHappened;
        }
     
        void B_SomethingHappened(object sender, EventArgs e)
        {
            Console.WriteLine("Called back from B.");
        }
     
        void C_SomethingHappened(object sender, EventArgs e)
        {
            Console.WriteLine("Called back from C.");
        }
    }
     
    class B
    {
        public static event EventHandler SomethingHappened = delegate { };
     
        public void DoSomething()
        {
            SomethingHappened(this, EventArgs.Empty);
        }
    }
     
    class C
    {
        public static event EventHandler SomethingHappened = delegate { };
     
        public void DoSomething()
        {
            SomethingHappened(this, EventArgs.Empty);
        }
    }
     
    class Program
    {
        static void Main(string[] args)
        {
            B b = new B();
            C c = new C();
     
            A a = new A();
     
            b.DoSomething();
            c.DoSomething();
        }
    }

  3. #3
    Membre régulier
    Homme Profil pro
    étudiant
    Inscrit en
    Septembre 2011
    Messages
    342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 342
    Points : 124
    Points
    124
    Par défaut
    merci Pragmateek,
    maintenant mon problème je pense est dans la condition "if" voici ce que j'ai fais:
    FormA:

    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
    public void button3_Click(object sender, EventArgs e) 
            {
                if (nv.button6WasClicked) //toujours j'ai un problème de null reference là
                {
                    nv.textBox3.Text = this.compteDataGridView.SelectedRows[0].Cells[0].Value.ToString();
                    nv.button6WasClicked=false;
                    this.Hide();
                }
                else if (mo.button6WasClicked)
                {
                    mo.textBox3.Text = this.compteDataGridView.SelectedRows[0].Cells[0].Value.ToString();
                    mo.button6WasClicked = false;
                    this.Hide();
                }
                else
                {
                    MessageBox.Show("Erreur de charegement de forme", "Erreur ");
                }
            }
    et les consructeurs les voici:
    FormB nv;
    FormC mo;

    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 FormA(FormB nv1)
            {
                InitializeComponent();
                nv = nv1;
     
            }
     
            public FormA(FormC modifFamillImmo1)
            {
                // TODO: Complete member initialization
                InitializeComponent();
                mo = modifFamillImmo1;
     
            }
    les 2 formes FormB et FormC utilisent la FormA,dans la FormA je doit tester si le bouton de FormB a été cliqué pour faire traitement,ou celle de FormC pour faire un autre traitement
    j'ai le problème "null reference " à la première ligne de la condition

    remercie encore

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    Bonjour,

    Si on admet que tu utilise toujours les classe B et C tu peux mettre A en abstract et implementer ton handler dans b et c

    Bonne jouréne

  5. #5
    Membre régulier
    Homme Profil pro
    étudiant
    Inscrit en
    Septembre 2011
    Messages
    342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 342
    Points : 124
    Points
    124
    Par défaut
    merci jouana est ce que vous avez un exemple précis qui peux m'aider et merci encore une fois

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654

  7. #7
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Pourquoi 2 constructeurs ?

    L'idée est de fournir à A les instances de B et C :
    - soit on les passe via le constructeur comme je l'indiquais,
    - soit via des propriétés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    B b { get; set; }
    C c { get; set; }
    qui devront être alimentées avant de déclenchement de l’événement.

  8. #8
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    Sinon tu peux utiliser le pattern command avec une factory methode

  9. #9
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Attention mon détecteur d'overengineering s'affole.

    Plus sérieusement je ne pense pas qu'il soit nécessaire d'avoir recours à autant de raffinement pour résoudre ce problème là.
    Mais merci de fournir des outils qui pourront servir dans des situations plus complexes.

  10. #10
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    Bonjour,

    C'est un étudiant il est donc plutôt bien de profiter de cette période pour faire des expériences


    Sinon comme ça

    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
     
     
    class A {
     
      doSomethingB();
      doSomeThingC();
     
    }
     
    class B {
       private A _a;
       B(A a) { _a = a; }
      dosomething() { _a.doSomethingB()}
    }
     
    class C {
       private A _a;
       C(A a) { _a = a; }
      dosomething() { _a.doSomethingC()}
    }
    Cordialement.

Discussions similaires

  1. Problème d'appel d'utilisation de classe
    Par RASS15 dans le forum C++
    Réponses: 3
    Dernier message: 02/04/2010, 00h23
  2. Réponses: 9
    Dernier message: 09/12/2008, 00h07
  3. Réponses: 9
    Dernier message: 25/06/2008, 16h42
  4. Problème d'utilisation des classes
    Par CyberSlan dans le forum C++
    Réponses: 10
    Dernier message: 16/05/2008, 14h31
  5. [POO] Problème avec l'utilisation de classes.
    Par sekiryou dans le forum Langage
    Réponses: 3
    Dernier message: 16/02/2006, 18h54

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