7

私はデリゲートについて勉強しています。数日前、私はマルチキャストデリゲートのサンプルを作成し、ここで以前の質問を確認し、マルチキャストデリゲートについて明確に理解しました。

しかし今、私はイベントでマルチキャストデリゲートサンプルを実行しようとしています。しかし、サンプルを作成しているときにいくつか疑問がありました。上記のリンクでは、すべての関数とデリゲート宣言を1つのクラスで実行し、+ =を使用して関数をデリゲートに追加し、デリゲートを呼び出すだけです。したがって、デリゲート内のすべての関数が呼び出されます。

しかし今、私は2つの異なるクラスでそれを行っており、イベントの助けを借りてすべての機能を実行しようとしています。現在のコードを以下に示します。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        ArithmeticOperations aOperations = new ArithmeticOperations();
        aOperations.StartCalculations += new ArithmeticOperations.BasicCalculations(aOperations_StartCalculations);
        aOperations.PerformCalculations(20, 10);
    }

    void aOperations_StartCalculations(string msg)
    {
        MessageBox.Show(msg);
    }
}


class ArithmeticOperations
{
    public delegate void BasicCalculations(string msg);

    public event BasicCalculations StartCalculations;


    public void PerformCalculations(int n1, int n2)
    {
        StartCalculations("Operation Success");
    }

    void Add(int num1, int num2)
    {
        MessageBox.Show("Performing addition.");
    }

    void Sub(int num1, int num2)
    {
        MessageBox.Show("Performing substraction.");
    }

    void Mul(int num1, int num2)
    {
        MessageBox.Show("Performing multiplication.");
    }

    void Div(int num1, int num2)
    {
        MessageBox.Show("Performing division.");
    }

}

ここForm1には私のメインクラスがあり、ArithmeticOperationsクラスは機能を実行するために使用しています。この声明のとき

aOperations.PerformCalculations(20, 10);

Form1では、ArithmeticOperationsクラスのPerformCalculation()関数が実行されます。

しかし、私の疑問は、すべてのAdd、Sub、Mul、およびDiv関数をArithmeticOperationsクラスのデリゲートに登録して、デリゲートオブジェクトを呼び出すだけですべての関数を呼び出し、Form1クラスのイベントコールバック関数に「OperationSuccess」を返す方法です。

4

2 に答える 2

3

オプションの1つは、プライベートイベントを作成することです

  public delegate void BasicCalculations(string msg);

public delegate void DoMath(int na, int nb);
class ArithmeticOperations
{
    public ArithmeticOperations()
    {
        StartMath += new DoMath(ArithmeticOperations_StartMath);

    }

    void ArithmeticOperations_StartMath(int na, int nb)
    {
        Add(na, nb);
        Sub(na, nb);
        Mul(na, nb);
        Div(na,nb);
    }




    public event BasicCalculations StartCalculations;
    private event DoMath StartMath;

    public void PerformCalculations(int n1, int n2)
    {
        StartMath(n1, n2);
        StartCalculations("Operation Success");
    }

    void Add(int num1, int num2)
    {
        Console.WriteLine("Performing addition.");
    }

    void Sub(int num1, int num2)
    {
         Console.WriteLine("Performing substraction.");
    }

    void Mul(int num1, int num2)
    {
         Console.WriteLine("Performing multiplication.");
    }

    void Div(int num1, int num2)
    {
         Console.WriteLine("Performing division.");
    }

}
于 2013-03-05T12:06:29.187 に答える
3

BasicCalculationstype の単一の引数を取るため、メソッドなどstringを直接呼び出すために使用することはできません。AddSubtract

マルチキャスト経由で各メソッドを呼び出したい場合はPerformCalculations、 と同等の型のデリゲートが必要になりますAction<int, int>。たとえば、次のようになります。

class ArithmeticOperations
{
    public delegate void BasicCalculations(string msg);

    public event BasicCalculations StartCalculations;

    private Action<int, int> calculations;

    public ArithmeticOperations()
    {
        this.calculations += this.Add;
        this.calculations += this.Sub;
    }

    public void PerformCalculations(int n1, int n2)
    {
        this.calculations.Invoke(n1, n2);
        StartCalculations("Operation Success");
    }

    // ...
}

個々の算術メソッドで文字列を使用してイベントを呼び出したい場合はStartCalculations、次のように実行させることができます。

void Add(int num1, int num2)
{
    StartCalculations("Performing addition.");
}

イベントを発生させるときは、最初にサブスクライバーがあることをテストする必要があります (を回避するためNullReferenceException)。標準的なパターンは、サブスクライブされたハンドラーを取得し、テストしてnullからハンドラーを呼び出すことです。NullReferenceExceptionこれにより、 のイベントをテストした後に誰かが登録を解除した場合に、 にヒットするのを回避できnullます。

void Add(int num1, int num2)
{
    var handler = this.StartCalculations;
    if (handler != null)
    {
        handler("Performing addition.");
    }
}

これは各メソッドのコードの繰り返しが多くなるため、別のメソッドにリファクタリングできます。

void Add(int num1, int num2)
{
    this.OnStartCalculation("Performing addition.");
}

void OnStartCalculation(string message)
{
    var handler = this.StartCalculations;
    if (handler != null)
    {
        handler(message);
    }
}
于 2013-03-05T12:01:00.497 に答える