首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

我眼中委派的真正面貌(二)(一)

     編輯:關於C語言

對於上一篇隨筆,不少朋友留下了很不錯的見解,也有不少朋友提出了很有代表性的問題。所以,在正文開始之前,我想先就這些問題闡述一下自己的觀點,也請朋友們給予批評指正:

首先來說,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("介面回呼仿真事件呼叫成功!");
        }
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved