自己动手用委托模拟.net中的事件机制
2008-10-29 13:54
447 查看
原理:委托支持多播委托,即:可以将多个方法绑定到同一个委托变量上(.NET有十分方便的语法实现和解除多播委托:+=和-=),形成所谓的委托链。
在.net开发中,我们之所以能方便地对某个控件增加事件,就是因为.net控件巧妙地封装了委托,这个从其增加事件的代码中可以很清除地看出:
this.button1.Click += new System.EventHandler(this.button1_Click)
private void button1_Click(object sender,EventArgs e){...}
知道了原理,就可以自己模拟出事件机制,代码:
//定义被触发者
public class Caculator
{
public class CaculateEvents : EventArgs
{
public readonly int x, y;
public CaculateEvents(int x, int y)
{
this.x = x;
this.y = y;
}
}
public delegate void CaculateEventHander(object sender, CaculateEvents e);
public event CaculateEventHander myhandler;
protected virtual void onCaculate(CaculateEvents e)
{
if (myhandler != null)
{
myhandler(this, e);
}
}
public void Caculate(int x, int y)
{
CaculateEvents e = new CaculateEvents(x, y);
onCaculate(e);
}
}
//定义呼叫者
class caller
{
public void Add(object sender, Caculator.CaculateEvents e)
{
Console.WriteLine(e.x + e.y);
}
public void Sub(object sender, Caculator.CaculateEvents e)
{
Console.WriteLine(e.x - e.y);
}
}
//模拟事件
class Program
{
static void Main(string[] args)
{
caller mycaler = new caller();
Caculator caculator = new Caculator();
caculator.myhandler += mycaler.Add;
caculator.myhandler += mycaler.Sub;
caculator.Caculate(100, 200);
Console.ReadLine();
}
}
在.net开发中,我们之所以能方便地对某个控件增加事件,就是因为.net控件巧妙地封装了委托,这个从其增加事件的代码中可以很清除地看出:
this.button1.Click += new System.EventHandler(this.button1_Click)
private void button1_Click(object sender,EventArgs e){...}
知道了原理,就可以自己模拟出事件机制,代码:
//定义被触发者
public class Caculator
{
public class CaculateEvents : EventArgs
{
public readonly int x, y;
public CaculateEvents(int x, int y)
{
this.x = x;
this.y = y;
}
}
public delegate void CaculateEventHander(object sender, CaculateEvents e);
public event CaculateEventHander myhandler;
protected virtual void onCaculate(CaculateEvents e)
{
if (myhandler != null)
{
myhandler(this, e);
}
}
public void Caculate(int x, int y)
{
CaculateEvents e = new CaculateEvents(x, y);
onCaculate(e);
}
}
//定义呼叫者
class caller
{
public void Add(object sender, Caculator.CaculateEvents e)
{
Console.WriteLine(e.x + e.y);
}
public void Sub(object sender, Caculator.CaculateEvents e)
{
Console.WriteLine(e.x - e.y);
}
}
//模拟事件
class Program
{
static void Main(string[] args)
{
caller mycaler = new caller();
Caculator caculator = new Caculator();
caculator.myhandler += mycaler.Add;
caculator.myhandler += mycaler.Sub;
caculator.Caculate(100, 200);
Console.ReadLine();
}
}
相关文章推荐
- 自己动手用委托模拟.net中的事件机制
- 自己动手写客户端UI库——事件机制(设计思路大放送)
- .net的事件与委托机制
- .Net委托机制之事件委托
- 深入理解.net的事件与委托机制
- .Net 机制下委托(一) 事件委托
- .NET 机制下的事件委托
- 深入理解.net的事件与委托机制
- 深入理解.net的事件与委托机制
- 自己动手写一个测试Android事件传递机制的demo
- 深入理解.net的事件与委托机制
- 深入理解.net的事件与委托机制
- .Net 机制下委托(一) 事件委托
- .NET事件机制之多播委托
- 模拟winform里的控件的事件和委托机制
- 深入理解.net的事件与委托机制
- 深入理解.net的事件与委托机制
- Javascript事件模型系列(二)事件的捕获-冒泡机制及事件委托机制
- Flex经验谈---用事件模拟一个Flex内部消息机制
- 事件,使用.net自带委托EventHandler