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

我眼中委托的真正面貌(一)(2)

編輯:關於C語言

首先,我們定義委托類型void MyDelegete();

這裡有必要強調一下委托的聲明規則:委托使用關鍵字delegate來聲明,因其本身就是一種類型,故可以在類內聲明,亦可以獨立於類而聲明。關鍵字之後是此委托類型的實體部分。不難看出其形式與方法的聲明相近,但不包含函數體。

其實,我們大可理解為委托本身就是定義了一類方法,一類其返回值與參數表和委托實體定義形式完全相同的方法。只有符合委托規則的方法,才可以掛接於此委托的實例對象之上。這也是為什麼,我將整個void MyDelegete()稱作委托類型的原因。

接下來我們要在某一個類內部,運用先前定義的委托類型實例化一個委托對象MyObjdelegate,並為其掛載一個與之委托類型(無返回值,無參數)相符的自定義方法MyFun(),這也就是所謂“將方法MyFun()的相關細節包裝於委托實例MyObjdelegate中”。而後即可在相應的按鈕單擊事件中利用委托對象MyObjdelegate調用其已經包裝的方法MyFun()了。

以上即為由委托定義而得來的委托的簡單用法。不過,以上這個實例顯然沒有什麼實際用途,因為不涉及類間的相互調用,我們大可在事件中直接調用本類的方法MyFun(),而不必再多繞個彎依靠委托來實現。

不過,如果涉及到跨類的方法調用時,使用委托會怎麼樣呢?

2.使用本類的委托對象包裝其他類的方法

namespace MulClsDelegate

{

    delegate void MyDelegete();

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private MyDelegete MyObjdelegate = new MyDelegete(ObjCls.MyFun);

        private void button1_Click(object sender, EventArgs e)

        {

            MyObjdelegate();

        }

    }

    public class ObjCls

    {

        static public void MyFun()

        {

            MessageBox.Show("委托掛載的事件調用成功!");

        }

    }

}

這段代碼和上一段代碼的意思大同小異,委托類型void MyDelegete()的聲明被我移到了類的外面,當然這不影響大局。主要區別只在於這段代碼涉及到了使用本類委托對象跨類包裝其他類的方法細節問題——我把原來主類中的MyFun()方法移到了新聲明的一個類ObjCls中,然後再靠主類中的委托對象去調用這個方法。

或許你可能會說,即使我不用委托,也可以通過在主類中聲明其他的類對象,然後通過這個類對象來調用其他類的public方法。這樣一來,使用委托依然沒有什麼實實在在的意義。

那麼,呵…… 我們不妨繼續耐心而深入的挖掘委托更深層次的用途

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved