7

我正在研究代表。几天前,我为多播代表做了一个示例,并在这里复习了我以前的问题,并清楚地了解了多播代表。

但现在我试图用一个事件来做一个多播委托示例。但是我在做样品时遇到了一些疑问。在上面的链接中,我在一个类中完成了所有函数和委托声明,并使用 += 将函数添加到委托中,然后调用委托。所以委托中的所有函数都被调用了。

但现在我在两个不同的课程中做这件事,并试图在一个事件的帮助下完成所有功能。我在下面提供我当前的代码。

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 类中的事件回调函数来调用所有函数?

4

2 回答 2

3

由于BasicCalculations接受一个类型的参数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.");
}

引发事件时,您应该首先测试是否有订阅者(以避免 a 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 回答
3

其中一个选项是创建一个私人活动

  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 回答