1

classA と classB の 2 つのクラスがあるとします。オブジェクト A (classA の) には、いくつかのオブジェクト B (classB の) が含まれています。B オブジェクトにはイベントがあり、オブジェクト A は (これらの B オブジェクトのいずれかの) イベントが発生したときに実行されるデリゲートをサブスクライブしています。

private void fooEventHandler(object sender, EventArgs e)
{
...
}

fooEventHandler で何かを行った後 (これは A 内で行う必要があります)、イベントを発生させた B オブジェクトに、fooEventHandler で行ったことの結果を通知したいと考えています。だから私は次のことをします:

private void fooEventHandler(object sender, EventArgs e)  
    {
    ...

        if (allOK)
           ((classB)sender).isOK();
        else
          ((classB) sender).isNotOK();
    }

そのため、実際には送信者を使用して、イベントが発生した後に objectB の特定のメソッドを呼び出しています。設計の観点からobjectBにあるべきではないobjectAメンバーをobjectB(彼のコンストラクター)に渡さないようにするために、これをすべて行っています。これは問題を処理するための合理的な方法ですか? このように (オブジェクト送信者) を使用するのは一般的ですか?

4

3 に答える 3

2

AクラスとBクラスを組み合わせすぎていると思います。イベントを処理した後に A が行う必要があるのは、特定のコールバックを呼び出すことだけである場合は、コールバックを渡します。このようにして、たとえばラムダ式を渡したり、B などに関連するクラスのメソッドを渡したりできます。

そう -

private void fooEventHandler(Action p_okCallback, Action p_notOkCallback)  
{
    ...

    if (allOK)
       p_okCallback();
    else
      p_notOkCallback();
}

また -

private void fooEventHandler(Action<bool> p_callback)  
{       
    ...

    p_callback(allOk);
}

イベントがあなたの制御下にない場合は、Helmer が提案したようにして、EventArgs から継承することができます。しかし、繰り返しになりますが、クラス自体ではなく、コールバックを渡します。

もう 1 つのオプション - 複数のメソッドが必要になり、多数のコールバックを渡すのが面倒な場合は、必要なメソッドだけをインターフェイスに渡すことを検討してください。

于 2013-08-25T19:13:35.360 に答える
1

それは解決策ですが、それはより良い方法ではないと思います。

ここに別の解決策があります

ステップ 1: - EventArgs の継承クラスを作成し、クラス B で行う処理を定義するいくつかのプロパティを追加します。

サンプルの場合:

public class ClassBEventArgs : EventArgs
{
    bool treatmentIsOK = false;
}

ステップ 2: クラス B の同じ名前空間で、新しいデリゲート イベント定義を作成し、それを使用してイベントを宣言します。

サンプルの場合:

namespace ClassBNameSpace
{
   public delagate fooEventHandlerDelegate void (object sender, ClassBEventArgs e);

   public ClassB 
   {

   public event fooEventHandlerDelegate fooEventHandler;

   .........

ステップ 3 : ClassB で、ClassBEventArgs オブジェクトを使用して fooEventHandler イベントを発生させます。ClassA イベント ハンドラーで、treatIsOK EventArgs の正しい値を設定します。ClassA から ClassB へのイベント コールバック時に、treatIsOK プロパティの値を利用できます。

サンプルの場合:

.......
if (this.fooEventHandler != null)
{
    ClassBEventArgs customEventArgs = new ClassBEventArgs();
     this.fooEventHandler (this,customEventArgs);
     if (customEventArgs.treatmentIsOK )
     {
        this.isOK();  ==> Your code
     }
     else
     {
        this.isOK();  ==> Your code
     }
}
.......
于 2013-08-25T19:37:50.477 に答える