总看到委托的各种解释
我也根据自己的理解解释一下,实际以前说过很多次了
一.先要说一下操作一个东西的实质,包括3方面
1.知道这个东西是什么
2.知道这个东西在那
3.操作这个东西
二.再说一下方法(函数)是什么,方法就是一段可执行的代码,函数指针是什么,函数指针就是这个可执行代码的入口点
再看一下一个小例子(以前也写过),基于事件的我就不写了,省着大家糊涂
public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
b b1 = new b();
b1.myDelegate = new delegateExample(a1_DelegateEvent);
b1.B1();
}
public string a1_DelegateEvent(string Classname)
{
return Classname;
}
}
public delegate string delegateExample(string Classname);
public class b
{
public delegateExample myDelegate;
public void B1()
{
if (myDelegate != null)
{
myDelegate("b");
}
}
}
然后开是说正题,
1.定义一个委托,它实际就是方法的接口,稍微熟悉模式的人应该知道,接口就是一种规范抽象,那么定义这个委托什么用那,是和上边的第一点对应的,有了这个接口,只要依赖这个抽象,那么就知道这个东西是什么了.
2.然后再在b类里定义一个委托实例,(这里用代码解释)
public class b
{
public delegateExample myDelegate;
public void B1()//执行方法B1()
{
if (myDelegate != null)//b1.myDelegate = new delegateExample(a1_DelegateEvent);如果把方法的地址给我了
{
myDelegate("b");//把"b"给这个方法,并执行这个方法
}
}
}
3.类Default2 里调用
b1.myDelegate = new delegateExample(a1_DelegateEvent);把这个自己的方法地址给对象b1,找到地方了把
b1.B1();//当具备条件的时候执行
这就是一个简单的委托
委托提供了一种应用,什么那,就是可以在其它对象的方法里通过委托调用在自己的类里根据这个委托(接口)自定义一个方法
并可以把其它对象的资源用参数传给自定义的方法里.然后这个委托负责传递方法地址(入口点),
再说具体一下,用其它对象的服务的时候可以在自己对象里自定义方法处理(把自己的方法发给其它对象,告诉他这个服务用我的这个方法处理)
光这么说大家可能更糊涂了,然后再具体说例子
一.说一下一个系统监听回调的例子
系统分出一个线程,监听一个端口,监听这个端口什么时候接收信息,接收什么信息
1.Default2 自己的类
2.public string a1_DelegateEvent(string Classname)根据这个委托(接口)自定义一个方法
3.这个监听对象就是 b b1 = new b();其它对象
4.b1.myDelegate = new delegateExample(a1_DelegateEvent);这个委托负责传递方法地址
5.当信息来了的时候执行b1.B1();(这个我不知道咋执行的,是系统自己监视的,具体系统咋监听的端口,涉及到协议了,没研究过,只知道监听,嘿嘿,那位window强大哥的给解释一下)
6.myDelegate("b");执行传过来的a1_DelegateEvent方法.其中("b")是做为这个监听对象得到的传输信息,做为参数传给Default2对象a1_DelegateEvent方法的,我这里写死了,大家别信那,呵呵
7.又执行回到了Default2对象的这个方法
public string a1_DelegateEvent(string Classname)
{
return Classname;
}
现在(string Classname)有值了就是接收到的信息,然后在这个方法里处理,就可以直接操作对象Default2
8.打完收功,^_^
另:像timer,异步传输,还有页面服务器控件的点击事件等等都是这个原理,有个特点就是,系统封装了变化点执行的方法b1.B1();,还有委托线程是安全的.还有吗.................我也还在学了
再提一下,现在看下面的button改知道是怎么实现的把,是系统执行Button1.click()方法,然后在click()方法里把自己和发生的事传给页面这个方法的^_^,在服务器实际上是不存在什么真正事件驱动的(我认为,那位大大知道有拿板砖拍我,谢谢),唯一的事件是客户端用户点击了一下按钮,然后一直到处理完毕说白了就是对象调对象
protected void Button1_Click(object sender, EventArgs e)
{
}