通过委托定义事件
摘自:《你必须知道的.NET》
.NET的事件模型建立在委托机制之上,透彻的了解了委托才能明白的分析事件。可以说,事件是对委托的封装,从委托的示例中可知,在客户端可以随意对委托进行操作,一定程度上破坏了面向的对象的封装机制,因此事件实现了对委托的封装。
1. 定义一个内部事件参数类型,用于存放事件引发时向事件处理程序传递的状态信息,EventArgs是事件数据类的基类。
2. 声明事件委托,主要包括两个参数:一个表示事件发送者对象,一个表示事件参数类对象。
2. 定义事件成员。
4. 定义负责通知事件引发的方法,它被实现为protected virtual方法,目的是可以在派生类中覆写该方法来拒绝监视事件。
5. 定义一个触发事件的方法,例如Calculate被调用时,表示有新的计算发生。
//定义事件:
public class Calculator
{
//定义一个CalculateEventArgs,
//用于存放事件引发时向处理程序传递的状态信息
public class CalculateEventArgs : EventArgs
{
public readonly Int32 x, y;
public CalculateEventArgs(Int32 x, Int32 y)
{
this.x = x;
this.y = y;
}
}
//声明事件委托
public delegate void CalculateEventHandler(object sender, CalculateEventArgs e);
//定义事件成员,提供外部绑定
public event CalculateEventHandler MyCalculate;
//提供受保护的虚方法,可以由子类覆写来拒绝监视
protected virtual void OnCalculate(CalculateEventArgs e)
{
if (MyCalculate != null)
{
MyCalculate(this, e);
}
}
//进行计算,调用该方法表示有新的计算发生
public void Calculate(Int32 x, Int32 y)
{
CalculateEventArgs e = new CalculateEventArgs(x, y);
//通知所有的事件的注册者
OnCalculate(e);
}
}
//定义事件触发者,用来监听事件:
public class CalculatorManager
{
//定义消息通知方法
public void Add(object sender, Calculator.CalculateEventArgs e)
{
Console.WriteLine(e.x + e.y);
}
public void Substract(object sender, Calculator.CalculateEventArgs e)
{
Console.WriteLine(e.x - e.y);
}
}
//实现一个事件的处理程序:
public class Test_Calculator
{
public static void Main()
{
Calculator calculator = new Calculator();
//事件触发者
CalculatorManager cm = new CalculatorManager();
//事件绑定
calculator.MyCalculate += cm.Add;
calculator.Calculate(100, 200);
calculator.MyCalculate += cm.Substract;
calculator.Calculate(100, 200);
//事件注销
calculator.MyCalculate -= cm.Add;
calculator.Calculate(100, 200);
//运行结果:
//300
//300
//-100
//-100
}
}
public class Calculator
{
//定义一个CalculateEventArgs,
//用于存放事件引发时向处理程序传递的状态信息
public class CalculateEventArgs : EventArgs
{
public readonly Int32 x, y;
public CalculateEventArgs(Int32 x, Int32 y)
{
this.x = x;
this.y = y;
}
}
//声明事件委托
public delegate void CalculateEventHandler(object sender, CalculateEventArgs e);
//定义事件成员,提供外部绑定
public event CalculateEventHandler MyCalculate;
//提供受保护的虚方法,可以由子类覆写来拒绝监视
protected virtual void OnCalculate(CalculateEventArgs e)
{
if (MyCalculate != null)
{
MyCalculate(this, e);
}
}
//进行计算,调用该方法表示有新的计算发生
public void Calculate(Int32 x, Int32 y)
{
CalculateEventArgs e = new CalculateEventArgs(x, y);
//通知所有的事件的注册者
OnCalculate(e);
}
}
//定义事件触发者,用来监听事件:
public class CalculatorManager
{
//定义消息通知方法
public void Add(object sender, Calculator.CalculateEventArgs e)
{
Console.WriteLine(e.x + e.y);
}
public void Substract(object sender, Calculator.CalculateEventArgs e)
{
Console.WriteLine(e.x - e.y);
}
}
//实现一个事件的处理程序:
public class Test_Calculator
{
public static void Main()
{
Calculator calculator = new Calculator();
//事件触发者
CalculatorManager cm = new CalculatorManager();
//事件绑定
calculator.MyCalculate += cm.Add;
calculator.Calculate(100, 200);
calculator.MyCalculate += cm.Substract;
calculator.Calculate(100, 200);
//事件注销
calculator.MyCalculate -= cm.Add;
calculator.Calculate(100, 200);
//运行结果:
//300
//300
//-100
//-100
}
}
如果对设计模式有所了解,上述实现过程实质是Observer模式在委托中的应用,在.NET中对Observer模式的应用严格的遵守了相关的规范。在Windows Form程序开发中,对一个Button的Click就对应了事件的响应,例如:
this.button1.Click += new System.EventHandler(this.button1_Click);
用于将button1_Click方法绑定到button1的Click事件上,当有按钮被按下时,将会触发执行button1_Click方法:
private void button1_Click(object sender, EventArgs e)
{
}
{
}
本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利
This posting is provided "AS IS" with no warranties, and confers no rights.
This posting is provided "AS IS" with no warranties, and confers no rights.
浙公网安备 33010602011771号