2013-03-05 2 views
7

Я изучаю делегатов. Несколько дней назад я сделал образец для делегатов многоадресной рассылки и рассмотрел здесь My previous question и четко понял делегат многоадресной рассылки.Делегат и событие многоадресной передачи

Но теперь я пытаюсь сделать образец делегата многоадресной передачи с событием. Но у меня возникли некоторые сомнения при выполнении выборки. В приведенной выше ссылке я выполнил все функции и делегировал объявление в одном классе и добавил функцию для делегирования с помощью + = и просто вызвал делегат. Таким образом, вся функция внутри делегата вызывается.

Но теперь я делаю это в двух разных классах и пытаюсь выполнять все функции с помощью события. Я предоставляю свой текущий код ниже.

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, функция PerformCalculation() в классе ArithmeticOperations будет выполняться.

Но я сомневаюсь, как зарегистрировать все функции Add, Sub, Mul и Div для делегата в классе ArithmeticOperations, чтобы вызвать все функции, просто вызвав объект делегата и вернув «Успех операции» в функцию обратного вызова события в Form1 класс ?

+2

Ваш тип делегата 'BasicCalculations' (который вложен в классе, почему?) имеет сиговых nature 'BasicCalculations (string msg)', поэтому он принимает один аргумент, который является 'string'. Ваш метод 'Add' и т. Д. Принимает два аргумента, оба из которых -' int'. Итак, как этот метод может напрямую вписаться в ваше мероприятие? –

+0

К сожалению ... Я этого не видел ... ur right ... thankx – Arun

ответ

3

Поскольку BasicCalculations принимает один аргумент типа string, он не может быть использован для непосредственного вызова ваших методов Add, Subtract и т.д.

Если вы хотите 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). standard pattern заключается в том, чтобы получить подписчика любого обработчика, проверить на 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); 
    } 
} 
+0

Thanks Ergwun. Теперь я понял. Первый раз слышу об этом Боге <>. Спасибо за дополнительную информацию. – Arun

+0

Еще раз спасибо за предоставление дополнительной информации.:) – Arun

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."); 
    } 

} 
+0

Thankx saurabh. Ваше предложение слишком помогает мне это понять. благодаря – Arun

Смежные вопросы