2009-07-07 4 views
0

私はインターフェイス
を実装基本クラスを持っているいくつかのイベント
インタフェースを持っている私は、基本クラスを拡張する第三クラスを持っている(theConcreteClassのは、それを呼びましょう)のC# - イベントとインタフェースの

問題:私は何かのような何かを行うとき:IMyInterface i = new theConcreteClass()そして、イベントハンドラが呼び出されたことがないため、イベントのいずれか(i.someEvent + = some_handler; (おそらく)new()演算子が具象クラスを作成したとしても、イベントサブスクリプションは基本クラスに割り当てられ、具体クラスには割り当てられませんでした。

希望していることを願います。
提案がありますか?

おかげで、あなたは予想通りべき作業を説明している何
アディ・バルダ

+1

私たちが助けることができるように問題を示す小さな例を投稿してください - ありがとう! –

+3

私があなたが何を記述しているかに問題は見られません。どのようにあなたのイベントを引き起こしますか?コード例を教えてください。 – sisve

答えて

6

基本実装を隠している具体的なクラスでイベントを再度宣言しましたか?

あなたのコードは次のようになります。

public interface IInterface 
{ 
    event EventHandler TestEvent; 
} 

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

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

あなたのコメントに答えるために:

標準の練習は、基本クラスのメソッドを配置することです:

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

このパターンが役立ちますイベントを発生させるためのロジックを集中化し、ヌルなどをテストし、時間を捉えるのが容易になりますそのメソッドをオーバーライドすることによってイベントが子クラスで発生することを示します。

+0

しかし、どのように具体的なクラス内からイベントを呼び出すのですか? –

+0

this.TestEvent()またはbase.TestEvent() - あなたのニーズに合ったもの。 –

+0

@Adiでは、宣言したクラスからのみイベントをトリガできます。そのため、多くの実装ではOnEventNameという名前の保護されたメソッド(継承者からのみアクセス可能)が提供され、イベント引数でイベントをトリガーします。コンクリートクラスの – sisve

関連する問題