溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

interfac與類class互相轉(zhuǎn)換的方法是什么

發(fā)布時(shí)間:2022-01-14 09:21:04 來源:億速云 閱讀:136 作者:iii 欄目:互聯(lián)網(wǎng)科技

這篇文章主要介紹“interfac與類class互相轉(zhuǎn)換的方法是什么”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“interfac與類class互相轉(zhuǎn)換的方法是什么”文章能幫助大家解決問題。

        接口就是類(事物)的標(biāo)準(zhǔn),它規(guī)定了類(事物)的方法和屬性.一個(gè)類(事物)要實(shí)現(xiàn)一個(gè)接口的話,就必須實(shí)現(xiàn)它里面的方法和屬性.單一類(事物)我們就可以這樣簡單的理解,對(duì)于多個(gè)類(事物),接口不僅為這些類(事物)提供一個(gè)標(biāo)準(zhǔn),而且還為他們之間的關(guān)系進(jìn)行了約束,相當(dāng)于契約。
       我們通常的做法是:類實(shí)現(xiàn)接口-》對(duì)該類進(jìn)行實(shí)例化-》把類的實(shí)例轉(zhuǎn)換成實(shí)現(xiàn)的接口-》通過接口進(jìn)行操作,大體上是這么一個(gè)過程,你可以放心使用接口已知的方法和屬性,而不用去擔(dān)心調(diào)用出錯(cuò), 而且你不用去管方法的代碼是怎樣實(shí)現(xiàn)的。但是,我們可以思考一個(gè)問題:接口相當(dāng)于一個(gè)框架,是沒有實(shí)體內(nèi)容的(具體的代碼),一個(gè)類的實(shí)例轉(zhuǎn)換成接口實(shí)例后,是否可以反向轉(zhuǎn)換呢?如果不經(jīng)過腦袋思考的話,答案是否定的。但是,事實(shí)是怎樣的呢?下面看一下分析的結(jié)果:

      下面一段代碼,實(shí)現(xiàn)把一個(gè)自定義的控件動(dòng)態(tài)的增加到一個(gè)窗體中。

            //ControlLibrary.UserControl1控件實(shí)現(xiàn)了ControlLibrary.IValue接口,里邊只有SetValue方法
            Assembly assembly=Assembly.LoadFrom ("ControlLibrary.dll");
            Type t = assembly.GetType("ControlLibrary.UserControl1");
            MethodInfo me = t.GetMethod("InitControl");
            Object obj = Activator.CreateInstance(t);
            ControlLibrary.UserControl1 ctrl = (ControlLibrary.UserControl1)me.Invoke(obj, new object[] { 10 });
            _value=(ControlLibrary.IValue)ctrl;    //_value是接口變量
            ControlLibrary.UserControl1 c = (ControlLibrary.UserControl1)_value;
            UserControl c1 = (UserControl)_value;
            this.Controls.Add(c);

             藍(lán)色字體是主要部分,按理說這段代碼 ControlLibrary.UserControl1 c = (ControlLibrary.UserControl1)_value(把接口轉(zhuǎn)換成自定義控件) 是不可以實(shí)現(xiàn)的,也違背了我們寫程序的基本規(guī)則。

             但是,經(jīng)過分析上述做法是可能實(shí)現(xiàn)的,并且可以把接口轉(zhuǎn)換成自定義控件的實(shí)例增加到窗體中。請看一個(gè)反編譯后的代碼:

             圖1:在創(chuàng)建這個(gè)控件的時(shí)候會(huì)返會(huì)一個(gè)實(shí)例,同樣的會(huì)有一個(gè)實(shí)例的地址。ebp-4ch是一個(gè)指針地址。

             interfac與類class互相轉(zhuǎn)換的方法是什么

              圖2:當(dāng)把創(chuàng)建的實(shí)例轉(zhuǎn)換成接口后,會(huì)分配一個(gè)新的指針地址,原來的ebp-4ch變成了ebp-3ch

              interfac與類class互相轉(zhuǎn)換的方法是什么

              圖3:再把接口實(shí)例轉(zhuǎn)換成自定義的控件實(shí)例,指針地址依然是ebp-3ch。這就證明了,接口實(shí)例和轉(zhuǎn)換后控件實(shí)例共用一個(gè)地址。

              interfac與類class互相轉(zhuǎn)換的方法是什么

              圖4:把轉(zhuǎn)換后的控件實(shí)例增加到窗體中是可以的。這個(gè)地址依然是ebp-3ch。

              interfac與類class互相轉(zhuǎn)換的方法是什么

              c1 實(shí)例的地址也是ebp-3ch,上述分析說明了類實(shí)例轉(zhuǎn)換成接口實(shí)例后,可以對(duì)接口實(shí)例進(jìn)行反向轉(zhuǎn)換。

關(guān)于“interfac與類class互相轉(zhuǎn)換的方法是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI