您好,登錄后才能下訂單哦!
這篇文章主要介紹“interfac與類class互相轉換的方法是什么”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“interfac與類class互相轉換的方法是什么”文章能幫助大家解決問題。
接口就是類(事物)的標準,它規定了類(事物)的方法和屬性.一個類(事物)要實現一個接口的話,就必須實現它里面的方法和屬性.單一類(事物)我們就可以這樣簡單的理解,對于多個類(事物),接口不僅為這些類(事物)提供一個標準,而且還為他們之間的關系進行了約束,相當于契約。
我們通常的做法是:類實現接口-》對該類進行實例化-》把類的實例轉換成實現的接口-》通過接口進行操作,大體上是這么一個過程,你可以放心使用接口已知的方法和屬性,而不用去擔心調用出錯, 而且你不用去管方法的代碼是怎樣實現的。但是,我們可以思考一個問題:接口相當于一個框架,是沒有實體內容的(具體的代碼),一個類的實例轉換成接口實例后,是否可以反向轉換呢?如果不經過腦袋思考的話,答案是否定的。但是,事實是怎樣的呢?下面看一下分析的結果:
下面一段代碼,實現把一個自定義的控件動態的增加到一個窗體中。
//ControlLibrary.UserControl1控件實現了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);
藍色字體是主要部分,按理說這段代碼 ControlLibrary.UserControl1 c = (ControlLibrary.UserControl1)_value(把接口轉換成自定義控件) 是不可以實現的,也違背了我們寫程序的基本規則。
但是,經過分析上述做法是可能實現的,并且可以把接口轉換成自定義控件的實例增加到窗體中。請看一個反編譯后的代碼:
圖1:在創建這個控件的時候會返會一個實例,同樣的會有一個實例的地址。ebp-4ch是一個指針地址。
圖2:當把創建的實例轉換成接口后,會分配一個新的指針地址,原來的ebp-4ch變成了ebp-3ch
圖3:再把接口實例轉換成自定義的控件實例,指針地址依然是ebp-3ch。這就證明了,接口實例和轉換后控件實例共用一個地址。
圖4:把轉換后的控件實例增加到窗體中是可以的。這個地址依然是ebp-3ch。
c1 實例的地址也是ebp-3ch,上述分析說明了類實例轉換成接口實例后,可以對接口實例進行反向轉換。
關于“interfac與類class互相轉換的方法是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。