對於上一篇隨筆,不少朋友留下了很不錯的見解,也有不少朋友提出了很有代表性的問題。所以,在正文開始之前,我想先就這些問題闡述一下自己的觀點,也請朋友們給予批評指正:
首先來說,feiyang朋友提出了有關委托與函數指針間的連帶關系。我很贊同這樣的說法。
其實,對C++有所了解的朋友都會知道:一個類內部所包含的方法,其實在類內部僅僅表現為一個函數指針,其實現部分並未占用類的內存空間。假如我們在一個類內部聲明了一個委托實例對象,同時為它掛載了其他類內部的一個方法(當然,這個方法必須是共有型的),這樣,在本類內部就同樣擁有了這個方法的函數指針(可以理解為它被存儲在委托對象的內部)——這就相當於在本類內部聲明了一個一模一樣的方法。
而事實上,假如我們通過已聲明的委托對象來調用相應的方法,C#的編譯器將自動將其作為本類的聲明方法來對待(從C#編譯器的安全角度來論證,這個說法是行得通的)。其實目標委托對象並非真正意義上的類方法,而僅僅只是作為一個目標方法的代理方法而存在,這便是委托(代理)一詞的由來。
另外feiyang兄也提到了有關委托與接口回調機制的區別與聯系問題,我已經在上一篇隨筆中給予了回復,其中談到了有關接口回調方法所存在的一些限制。在這裡,我們不妨嘗試一下,使用接口回調是否可以實現C#的事件機制:
5(2)使用接口回調仿真控件的事件機制(嘗試)
首先,我們建立一個控件項目,代碼如下:
namespace InfceCalbckEvCtrl
{
public partial class UserControl1 : UserControl
{
//聲明接口類型
public interface ICallbackEvn
{
void ShowObjTxt(string Txt);
}
//定義(但不實例化)接口對象
public ICallbackEvn ObjCallEvn;
public UserControl1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
ObjCallEvn.ShowObjTxt("接口回調仿真事件調用成功!");
}
}
}