2009-07-07 22 views
0

Ich habe eine Schnittstelle mit mehreren Veranstaltungen
Ich habe Basis Klasse Implementierung der Schnittstelle
Ich habe dritte Klasse die Basisklasse erstreckt (die es theConcreteClass lassen nennen)C# - Veranstaltungen und Schnittstellen

Problem: Wenn ich etwas mache wie: IMyInterface i = new theConcreteClass() und dann abonnieren ich eines der Ereignisse (i.someEvent + = some_handler;) die Ereignishandler nie aufgerufen, weil (Wahrscheinlich) Die Ereignissubskription wurde der Basisklasse und nicht der konkreten Klasse zugewiesen, obwohl der Operator new() die konkrete Klasse erstellt hat.

hoffe es war klar :)
irgendwelche Vorschläge?

Dank,
Adi Barda

+1

Bitte poste ein kleines Beispiel, das dein Problem demonstriert, damit wir helfen können - danke! –

+3

Ich sehe keine Probleme in dem, was Sie beschreiben. Wie lösen Sie Ihre Veranstaltungen aus? Können Sie uns ein Codebeispiel zeigen? – sisve

Antwort

6

Was Sie sollte wie erwartet beschreiben.

Haben Sie die Ereignisse erneut in der konkreten Klasse deklariert, in der die Basisimplementierungen versteckt sind?

sollte Ihr Code sein:

public interface IInterface 
{ 
    event EventHandler TestEvent; 
} 

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

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

Ihren Kommentar zu beantworten:

Gängige Praxis ist es, ein Verfahren auf der Basisklasse zu platzieren:

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(); 
    } 
} 

Dieses Muster hilft Zentralisieren Sie jede Logik für das Auslösen des Ereignisses, Testen auf Null usw., und macht es einfach, sich in die Zeit einzuklinken Das Ereignis wird in untergeordneten Klassen durch Überschreiben der Methode ausgelöst.

+0

Aber wie kann ich das Ereignis aus der konkreten Klasse heraus aufrufen? –

+0

this.TestEvent() oder base.TestEvent() - was immer Ihren Anforderungen entspricht. –

+0

@Adi, Sie können das Ereignis nur von der Klasse auslösen, die es deklariert hat. Aus diesem Grund bieten viele Implementierungen eine geschützte Methode (nur für Erben zugänglich) namens OnEventName, die das Ereignis mit Ereignisargumenten auslöst. – sisve

Verwandte Themen