2009-07-07 6 views
0

j'ai une interface avec plusieurs événements
je la base classe qui implémente l'interface
je troisième classe extension de la classe de base (appelons-le theConcreteClass)C# - Événements et Interfaces

problème: quand je fais quelque chose comme: IMyInterface i = new theConcreteClass() puis je suis abonné à l'un des événements (i.someEvent + = some_handler;) les gestionnaires d'événements ne sont jamais invoqués parce que (probablement) l'abonnement à l'événement a été assigné à la classe de base et non à la classe concrète même si l'opérateur new() a créé la classe concrète.

espérons que c'était clair :)
des suggestions?

grâce,
Adi Barda

+1

Veuillez poster un petit exemple qui démontre votre problème afin que nous puissions vous aider - merci! –

+3

Je ne vois aucun problème dans ce que vous décrivez. Comment déclenchez-vous vos événements? Pourriez-vous nous montrer un exemple de code? – sisve

Répondre

6

Ce que vous décrivez devrait fonctionner comme prévu.

Avez-vous déclaré à nouveau les événements dans la classe concrète masquant les implémentations de base?

Votre code doit être:

public interface IInterface 
{ 
    event EventHandler TestEvent; 
} 

public class Base : IInterface 
{ 
    public event EventHandler TestEvent; 
} 

public class Concrete : Base 
{ 
    //Nothing needed here 
} 

Pour répondre à votre commentaire:

pratique courante consiste à placer une méthode sur la classe de base:

public class Base : IInterface 
{ 
    public event EventHandler TestEvent; 

    protected virtual void OnTestEvent() 
    { 
     if (TestEvent != null) 
     { 
      TextEvent(this, EventArgs.Empty); 
     } 
    } 
} 

public class Concrete : Base 
{ 
    public void SomethingHappened() 
    { 
     OnTestEvent(); 
    } 
} 

Ce modèle aide centraliser toute logique pour déclencher l'événement, tester null etc, et le rendre facile à accrocher dans le temps que l'événement se déclenche dans les classes enfant en remplaçant la méthode.

+0

mais comment puis-je invoquer l'événement à partir de la classe concrète? –

+0

this.TestEvent() ou base.TestEvent() - ce qui correspond à vos besoins. –

+0

@Adi, vous pouvez seulement déclencher l'événement de la classe qui l'a déclaré. C'est pourquoi de nombreuses implémentations fournissent une méthode protégée (uniquement accessible à partir de ceux qui héritent) appelée OnEventName qui déclenchera l'événement avec des arguments d'événement. – sisve