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 :

Héritage d'événements event EventHandler


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de stephane.julien
    Inscrit en
    Septembre 2007
    Messages
    342
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 342
    Par défaut Héritage d'événements event EventHandler
    Bonjour,

    J'ai une classe abstraite dans laquelle je déclare un événement event EventHandler. Je remarque avec surprise qu'il n'est pas possible de lancer l'événement depuis les classes enfant? Est-ce juste ou j'ai fait une faute?

    Si c'est juste, comment lancer des événements depuis les classes enfants?
    • Définition d'une méthode protected dans la classe abstraite qui lance l'événement ?
    • Définir l'événement en tant que virtual et le redéfinir dans les classees enfant ?
    • ... ?


    Merci d'avance de votre opinion / aide.

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Salut,

    Le pattern qu'on retrouve souvent dans les WinForms notamment est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Mere
    {
    public EventHandler MachinChanged;
    protected virtual void OnMachinChanged(EventArgs e)
    {
      if (MachinChanged ! null)
        MachinChanged(this, e);
    }
    }
    C'est ce que t'as mis dans ton premier point
    Et les classes filles n'ont qu'à lancer OnMachinChanged pour déclencher l'event.

    Un event est une propriété de type delegate, ce n'est pas une méthode, il n'a donc pas lieu d'être virtuel.

  3. #3
    Membre éclairé Avatar de stephane.julien
    Inscrit en
    Septembre 2007
    Messages
    342
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 342
    Par défaut
    Oui c'est ce que j'ai pu comprendre en regardant également dans les WinForms. La question que je me pose, c'est pourquoi la méthode OnMachinChanged est virtuelle ? Si celle ci est redéfinie par la classe enfant et qu'elle n'appelle pas base.OnMachinChanged(), l'événement ne sera pas lancé... Je trouve cela pas terrible...

    Et je me pose également la question suivante : Pourquoi l'événement ne peut pas être lancé directement depuis la classe enfant ??? S'il est internal, public ou protected, on devrait à avoir accès de la même manière qu'une méthode, non?

  4. #4
    Membre Expert Avatar de Tober
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 824
    Par défaut
    On utilise le mot clef virtual pour une bonne raison !
    Si t'as une classe A qui est derrive en une classe B.
    Dans B, tu devra redefinir imperativement toutes les fonctions virtual de A.
    Par exemple, une Composant graphique est une interface, et tout le monde sait qu'un composant graphique doit pouvoir s'afficher...
    D'ou l'utilisation d'une methode virtual Paint qui va permettre de dessiner un composant graphique...
    Donc quand tu vas derriver la classe Composant, tu devrais reecrire la fonction Paint decrivant comment afficher ce composant precis.

    Et apres, tu pourra avoir par exemple une liste de Composant (Sans savoir ce qu'il represente, et appele la fonction Paint qui sera automatiquement transtype dans le type du composant...

    Bon, je suis peut etre pas completement clair, mais dans ma tete, c'est tres claire

  5. #5
    Membre éclairé Avatar de stephane.julien
    Inscrit en
    Septembre 2007
    Messages
    342
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 342
    Par défaut
    Citation Envoyé par Tober Voir le message
    Dans B, tu devra redefinir imperativement toutes les fonctions virtual de A.
    Pas d'accord. Ce sont les méthodes abstract que tu dois redéfinir impérativement. Les méthodes virtual ne doivent pas être redéfinies obligatoirement. Sur le reste, je suis d'accord.

    Par contre je ne comprends pas pourquoi la méthode OnMachinChanged en particuler est virtual ???

  6. #6
    Membre Expert Avatar de Tober
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 824
    Par défaut
    Ah oui, je confond avec le C++
    Tous les evenement a mon avis doivent etre virtual, pour permettre a n'importe qui de pouvoir changer le comportement de l'evenement en question comme bon lui semble

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Citation Envoyé par stephane.julien Voir le message
    Par contre je ne comprends pas pourquoi la méthode OnMachinChanged en particuler est virtual ???
    Justement pour que les classes filles puissent déclencher l'event, visiblement.

    Par exemple, la class Form et son event Load. Il est public, donc n'importe qui peut exécuter n'importe quel code lorsqu'il est déclenché. La classe fille est avantagée, parce que plutôt que base.Load += uneFonction (qu'elle peut faire comme tout le monde), elle peut faire override OnLoad, qui sera lancée avant l'event. (puisqu'un appel de OnLoad dans la classe mère va appeler cette surcharge, qui elle-même dans 99% des cas appelle la fonction de base)

    Sans les fonctions OnMachin, la classe fille ne serait qu'une abonnée parmi d'autres.

    (je sais pas si c'est l'explication officielle mais c'est ce qui me parait le plus logique )

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

Discussions similaires

  1. Utilisation d'évènements (event)
    Par Stochelo dans le forum C++
    Réponses: 4
    Dernier message: 28/06/2013, 10h19
  2. Héritage et événements
    Par CyBeRoN dans le forum VB.NET
    Réponses: 1
    Dernier message: 29/04/2010, 15h36
  3. Comment ecrire dans l'évènement event.keycode
    Par The metalhorseman dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 03/10/2006, 19h59
  4. Héritage d'événements
    Par Rampa dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 05/07/2005, 10h32

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