對於上一篇隨筆,不少朋友留下了很不錯的見解,也有不少朋友提出了很有代表性的問題。所以,在正文開始之前,我想先就這些問題闡述一下自己的觀點,也請朋友們給予批評指正:
首先來說,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("介面回呼仿真事件呼叫成功!");
}
}
}