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 :

event : ne peut apparaître qu'à gauche de += ou -=


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 135
    Par défaut event : ne peut apparaître qu'à gauche de += ou -=
    Salut !
    voilà mon problème :

    Première classe, dans un premier assembly (executable)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        public class IApplicationFom
        {
            public delegate void notificationHandler(string name, string text, EventHandler handle);
            public event notificationHandler notification;
     
    ...
    deuxième classe, héritant de la première, dans un deuxième assembly (dll)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        public class Main : IApplicationFom
        {
              void bidon()
    {
    if( base.notification != null )
     base.notification("a","b",null);
    }
    ...
        }

    J'obtiens l'erreur à chaque "base.notification" (dans la fonction "bidon")
    Erreur 1 L'événement 'IApplicationFom.notification' ne peut apparaître qu'à gauche de += ou -=
    dans mon désespoir, j'ai même essayé de changer "base" par rien, ou par "this"... sans succès bien sûr.

    je comprends paaaaas
    le fait que la classe définissant l'évènement soit dans un assembly différent y est pour quelque chose ?

  2. #2
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Il faudrait lire un peu tout ce qu'on trouve entre les tutos, la MSDN, ... pour apprendre à correctement créer ses événements et respecter certains standards

    Pour commencer, le prototype des méthodes abonnées à un événement est standardisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void (object sender, EventArgs e)
    ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void (object sender, MyEventArgs e)
    avec MyEventArgs une classe dérivée de EventArgs qui va servir à transmettre des informations si l'événement en a l'utilité.

    Dans le cas présent, la classe d'arguments de l'événement serait la suivante
    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
    public class NotificationEventArgs : EventArgs
    {
        private string _name;
        private string _text;
     
        public string Name
        {
            get { return _name; }
        }
     
        public string Text
        {
            get { return _text; }
        }
     
        public NotificationEventArgs(string name, string text)
        {
            _name = name;
            _text = text;
        }
    }
    Ensuite, le code pour déclencher l'événement doit être dans la classe qui déclare l'événement. Généralement avec une méthode protected virtual, afin de donner un accès aux classes dérivées. Afin de respecter les standards, il convient donc de déclarer un délégué conforme aux recommandations. Question de standard encore, le nom des méthodes utilisées pour déclencher un événement est toujours de la forme On<NomDeLEvenement>.

    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 class ApplicationFom
    {
        public delegate void NotificationHandler(object sender, NotificationEventArgs e);
        public event NotificationHandler Notification;
     
        protected virtual void OnNotification(string name, string text)
        {
            NotificationHandler handler = Notification;
            if (handler != null)
            {
                handler(this, new NotificationEventArgs(name, text));
            }
        }
    }
    A partir du framework 2.0, on peut faire sans déclarer le délégué avec l'utilisation des génériques.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class ApplicationFom
    {
        public event EventHandler<NotificationEventArgs> Notification;
     
        protected virtual void OnNotification(string name, string text)
        {
            EventHandler<NotificationEventArgs> handler = Notification;
            if (handler != null)
            {
                handler(this, new NotificationEventArgs(name, text));
            }
        }
    }
    Pour finir pour déclencher l'événement il suffit d'appeler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OnNotification("name", "text")
    Autre remarque, le nom d'une classe ne doit pas commencer par I, sauf s'il s'agit bien de la première lettre du nom de la classe (Imprimante, Individu, ...). Car, question de standard toujours, la lettre I est réservée pour le nom des interfaces (ICloneable, IList, ...).

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 135
    Par défaut
    tre remarque, le nom d'une classe ne doit pas commencer par I, sauf s'il s'agit bien de la première lettre du nom de la classe (Imprimante, Individu, ...). Car, question de standard toujours, la lettre I est réservée pour le nom des interfaces (ICloneable, IList, ...).

    En effet, cette classe était avant une interface, jusqu'à ce que j'aie besoin de lui implémenter des methodes...

    A partir du framework 2.0, on peut faire sans déclarer le délégué avec l'utilisation des génériques.
    ça je savais pas, merci


    pour ce qui est des standards... étant donné que je suis le seul susceptible de relire un jour ce code, j'ai tendance à prendre quelques raccourcis plus pratique pour la lecture (pas besoin de connaitre l'objet déclencheur de l'évènement dans mon code )

    merci

Discussions similaires

  1. Comment un thread peut attendre le reset d'un event ?
    Par masterx_goldman dans le forum Windows
    Réponses: 2
    Dernier message: 01/10/2009, 09h49
  2. Réponses: 3
    Dernier message: 09/09/2009, 14h00
  3. Réponses: 4
    Dernier message: 03/12/2007, 18h35
  4. Réponses: 6
    Dernier message: 17/08/2006, 19h16
  5. Réponses: 2
    Dernier message: 21/07/2006, 06h55

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