程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 我眼中委托的真正面貌(二)(1)

我眼中委托的真正面貌(二)(1)

編輯:關於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