利用接口去理解委托


  開始使用C#中的委托時,有時會很難理解它的真正的含義,在使用時就會感覺不知道怎么使用它,其實最主要的還是不大明白它的機制, 或者說它的使用場景,首先解釋下委托,字面意思就知道它就是一個代理,一個委托,它是誰的代理呢,方法的代理。看下面的代碼:

上面的代碼就是定義一個委托來表示一類方法,使用一個字符串參數並無返回的一個方法, 只要滿足這種簽名的方法都可以用PrintLine委托實現方法的間接調用。下面自定義一個委托,結果是一樣的,但是調用的方法不一樣。

至於委托的底層實現, 可以參考FrameWork的源碼,就不展開了,今天我要講得是另外一種方法用實現不用委托的這種方法,像java里面就沒有委托這個概念的,哪它是怎么實現的呢、可以通過接口來實現:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Delegate
{
    interface Interface1
    {
        void PrintLine(string str);
    }
}

上面定義接口,讓不同的實現接口的類實現多態,從而可以間接去調用。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Delegate
{
    public class Class1 : Interface1
    {

        public void PrintLine(string str)
        {
            Console.WriteLine(str);
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Delegate
{
    class Class2 : Interface1
    {
        static void WriteLine(string str)
        {
            Console.WriteLine(str);
        }

        public void PrintLine(string str)
        {
            WriteLine(str + "cc");
        }
    }
}

下面是不同的類調用,從而可以實現多態,是不是類似委托:

 

 通過接口同樣可以實現委托那樣的效果,但是卻比較麻煩,要定義接口,然后實現接口的類重寫接口方法,顯然委托比較簡潔,但是背后是微軟幫我們封裝了方法調用,實際上也就是封裝了類的實例引用和方法指針引用,如   Interface1 cls1 = new Class1();cls1.PrintLine("Test");編譯器要知道的是哪個類重寫了Interface1接口中的PrintLine方法,因為new  Class1(),所以它就就只調用Class1的實例的PrintLine方法,而委托則把這個對象實例的引用封裝起來,存儲在Delegate類的的一個_target字段中,從而可以引用各種不同的對象實現,而方法存儲在另外一個_methodPtr字段中,從而可以存儲不同的方法,但是前提是方法簽名相同。然后還可以定義一個數組存儲多個委托,從而達到多播委托的效果。

  

    不知道上面這樣解釋有沒有對你有更好的理解,歡迎補充與建議

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM