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 :

S'abonner à un événement dans une classe fille [Débutant]


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2017
    Messages : 7
    Points : 19
    Points
    19
    Par défaut S'abonner à un événement dans une classe fille
    Bonjour,

    Je dispose de deux classes avec une relation d'héritage (La classe Robot hérite de Machine). Je créer un événement qui est déclenché lorsque j'appui sur le bouton MoveOn_MouseDown. Je cherche a remonter mon événement jusqu’à la classe fille (Robot).

    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
    public class Machine
        {
            public delegate void ChangedEventHandler(object sender, EventArgs e);
            public event ChangedEventHandler Changed;
     
    /// <summary>
            /// Evénement déclencher lors de l'appui sur le bouton play
            /// </summary>
    private void MoveOn_MouseDown(object sender, MouseButtonEventArgs e)
            {
                if (this.GetMoveMachine() == "Off")
                {
                    this.SetMoveMachine("On");
                    Play_Event(sender, e);
                }
            }
     
    protected void Play_Event(object sender, EventArgs e)
            {
                if (Changed != null)
                {
                    Changed(sender, e);
                }
            }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class Robot : Machine
        {
    public Robot (...)
    :base(...)
    {
    base.Changed += new ChangedEventHandler(Play_Event);
    }
    J'ai tenté de faire ça mais sans trop comprendre et puis ça ne marche pas. Du coup, je viens vers vous pour savoir comment m'abonner à mon événement (et surtout des explications pour que je comprenne =) ) ?

    Merci d'avance

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    faire communique une classe avec une classe fille n'a pas de sens
    la classe fille est "fusionnée" avec la classe parente à la compilation, donc tu peux appeler ce que tu veux entre les 2 sans évènement

    un évènement ca sert quand 2 instances différentes veulent s'avertir de quelque chose


    de plus gérer un évènement d'interface utilisateur dans une classe ca ne se fait pas trop
    une classe doit avoir des méthodes indépendantes du type d'interface, l'interface appellera les méthodes

    et il ne suffit pas d'écrire private void MoveOn_MouseDown pour être abonné à l'évènement
    et pour finir ton event, il va faire une boucle infinie, car tu demandes à rappeler la méthode qui lève l'évènement quand l'évènement est levé
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2017
    Messages : 7
    Points : 19
    Points
    19
    Par défaut
    Merci de ta réponse,

    Citation Envoyé par Pol63 Voir le message
    faire communique une classe avec une classe fille n'a pas de sens
    la classe fille est "fusionnée" avec la classe parente à la compilation, donc tu peux appeler ce que tu veux entre les 2 sans évènement
    Oui maintenant que tu le dis je vois bien que cela n'a pas de sens.

    Citation Envoyé par Pol63 Voir le message
    et il ne suffit pas d'écrire private void MoveOn_MouseDown pour être abonné à l'évènement
    Si j'ai bien compris c'est cette partie qui te permet de t'abonner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... += new ChangedEventHandler(Play_Event);
    Il suffit "juste" d'ajouter cette partie dans un contrôleur par exemple (ce que je souhaite faire en réalité)

    Citation Envoyé par Pol63 Voir le message
    et pour finir ton event, il va faire une boucle infinie, car tu demandes à rappeler la méthode qui lève l'évènement quand l'évènement est levé
    Je n'ai pas trop bien compris, il ne faut pas passer par un event dans ce cas ?!

  4. #4
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 898
    Points : 1 915
    Points
    1 915
    Par défaut
    Citation Envoyé par Dinam54 Voir le message
    Citation Envoyé par Pol63 Voir le message
    et pour finir ton event, il va faire une boucle infinie, car tu demandes à rappeler la méthode qui lève l'évènement quand l'évènement est levé
    Je n'ai pas trop bien compris, il ne faut pas passer par un event dans ce cas ?!
    Ce que Pol63 veut t'expliquer c'est que ta méthode Play_Event va déclencher l'événement ; et dans ta classe fille tu abonnes la méthode Play_Event à l'événement. Du coup à un moment tu vas appeler ta méthode Play_Event, qui va déclencher l'événement, qui va appeler Play_Event, qui va déclencher l'événement, qui va appeller Play_Event... jusqu'au stack overflow...

  5. #5
    Membre actif
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2016
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Brazzaville

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

    Informations forums :
    Inscription : Mars 2016
    Messages : 154
    Points : 268
    Points
    268
    Par défaut
    Bonjour,
    il me semble que tu dois définir une méthode dans ta classe fille qui va être appelée quand l'évènement sera levé dans la classe de base. ce n'est pas pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    base.Changed += new ChangedEventHandler(Play_Event);
    mais ce sera plutôt une méthode de la classe fille qui doit être appelée par ce delegate.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2017
    Messages : 7
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par Prisson Voir le message
    Bonjour,
    il me semble que tu dois définir une méthode dans ta classe fille qui va être appelée quand l'évènement sera levé dans la classe de base. ce n'est pas pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    base.Changed += new ChangedEventHandler(Play_Event);
    mais ce sera plutôt une méthode de la classe fille qui doit être appelée par ce delegate.
    Oui c'est vrai.
    merci de ta réponse

  7. #7
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 898
    Points : 1 915
    Points
    1 915
    Par défaut
    Les événements servent plutôt lorsqu'un classe veut en informer d'autres que quelque chose s'est produit. Dans un contexte où une classe mère veut activer une fonctionnalité d'une classe fille on peut passer par une méthode virtual protected qui sera redéfinie dans la classe fille pour effectuer ses traitements spécifiques :

    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
    namespace Samples
    {
        public class ProcessContext
        {
            public int Step { get; set; }
        }
     
        public class Machine
        {
            public void Process()
            {
                var context = new ProcessContext { Step = 1 };
                ChildSpecificProcess(context);
            }
     
            protected virtual void ChildSpecificProcess(ProcessContext context) { }
        }
     
        public class SpecializedMachine : Machine
        {
            protected override void ChildSpecificProcess(ProcessContext context)
            {
                Console.WriteLine(context.Step);
            }
        }
    }

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

Discussions similaires

  1. Event dans une classe fille de wxMenuBar
    Par elraton dans le forum wxWidgets
    Réponses: 6
    Dernier message: 28/08/2008, 10h41
  2. Définir des événements dans une classe
    Par Masmeta dans le forum Windows Forms
    Réponses: 5
    Dernier message: 29/04/2008, 17h41
  3. Réponses: 4
    Dernier message: 16/03/2008, 18h06
  4. Initialisation const dans une classe fille
    Par cyberjoac dans le forum C++
    Réponses: 3
    Dernier message: 07/10/2007, 17h53
  5. Héritage d'un événement pour une classe fille
    Par korntex5 dans le forum Langage
    Réponses: 4
    Dernier message: 11/01/2006, 16h48

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