總看到委託的各種解釋
我也根據自己的理解解釋一下,實際以前說過很多次了
一.先要說一下操作一個東西的實質,包括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)
{
}