接口的终结解释
接口
簡單的說接口就是一個契約或者規(guī)范.比如遙控器,國家出臺了一個國家遙控器規(guī)范,明文要求所有的遙控器廠家都要遵循這個規(guī)范,如果不遵循規(guī)范就不給3C認(rèn)證標(biāo)志,就不允許上市出賣..為什么要這個規(guī)范呢?大家在時間生活中會經(jīng)常碰到,甲廠的遙控器不能遙控乙廠的電視,電視遙控器不能遙控其它電器如空調(diào),冰箱.!原因是什么呢?是各個遙控器都沒有遵循一個規(guī)范,電波有長有短,電壓有高有低,導(dǎo)致各自為政,4分5列!??
????可以想像出國家遙控器標(biāo)準(zhǔn)只是是規(guī)定遙控器的一些重要技術(shù)指標(biāo),比如要發(fā)射波應(yīng)該多長,電壓應(yīng)該多高,...,但它絕對不會規(guī)范出遙控器的材質(zhì),形狀,重量和顏色,也是說規(guī)范把所有同遙控?zé)o關(guān)的東西都拋棄了!每個遙控器廠家只要遵循了規(guī)范,那么對遙控器可以有任意的詮釋.比如A廠可以用鐵做,牢固無比,B廠可以用紙,可以任意折疊,anyway,不管用什么做,做出什么樣子,只要遵循規(guī)范的遙控器就可以遙控所有的電器(當(dāng)然電器廠家也要遵循一定的規(guī)范),甚至可以遙控導(dǎo)彈發(fā)射!利害吧,這就是接口的威力.??
????再詳細(xì)點(diǎn),接口就是一個規(guī)范,他和具體的實現(xiàn)無關(guān)!接口是規(guī)范(虛的),他只是一張紙,也是說在實際的使用中接口只有依托一個實現(xiàn)了它的類的實例,才會有意義,如上面的各個廠家做的遙控器產(chǎn)品.每個實現(xiàn)接口的類(廠家)必需實現(xiàn)接口中所有的功能.??一旦一個類實現(xiàn)了一個接口,就可說一個類和接口捆綁了(這個很重要,做題目的時候會用到)
????來個例子
????interface??遙控器規(guī)范????//國家定義的遙控器規(guī)范??,每個遙控器廠家必需實現(xiàn)(詮釋)它
????{
??????????int??波長();
??????????int??電壓();
????}
????class????甲廠鐵遙控器??:??遙控器規(guī)范????//甲廠的遙控器實現(xiàn)(詮釋)了這個規(guī)范,它和遙控器規(guī)范捆綁了!好,它可以在市場上出售了
????{
??????????public??int??波長();????????????????????????//規(guī)范上定義的指標(biāo)??
??????????public??int??電壓();????????????????????????//規(guī)范上定義的指標(biāo)??
??????????public??int??形狀()??{??正方形};??????????//甲廠自己對該產(chǎn)品的詮釋????
??????????public??int??材質(zhì)()??(??鐵??};??????????????????//甲廠自己對該產(chǎn)品的詮釋
????}
????class??乙廠紙遙控器??:??遙控器規(guī)范????甲廠的遙控器實現(xiàn)(詮釋)了這個規(guī)范,它和遙控器規(guī)范捆綁了!好,它可以在市場上出售了
????{
??????????public??int??波長();??????????????????????規(guī)范上定義的指標(biāo)??
??????????public??int??電壓();????????????????????//規(guī)范上定義的指標(biāo)????????
??????????public??int??形狀()(??圓形);??????????//甲廠自己對該產(chǎn)品的詮釋,是圓形
??????????public??int??材質(zhì)()(??紙);??????????????//甲廠自己對該產(chǎn)品的詮釋,用紙做,好酷!??????
????}
????class??電器
????{procedure??接收遙控(遙控器規(guī)范??)????//電器上,接收遙控指令
????????{.....
??????????????接收(遙控器規(guī)范.波長)??;??????????????
??????????????接收(遙控器規(guī)范.電壓);
??????????????.....}??????}????
????static??main()
????{
????????甲廠鐵遙控器????ControlA????;????//申明控制器對象
????????乙廠紙遙控器????ControlB????;
????????ControlA????=??new??甲廠鐵遙控器();??//實例化控制器對象,這個時候系統(tǒng)在托管堆中為該對象分配了空間
????????ControlB????=??new??乙廠紙遙控器()??;
????????遙控器規(guī)范????ControlInterfaceA??=??(遙控器規(guī)范)遙控器1??;????//把對象實例轉(zhuǎn)換成一個規(guī)范,為什么呢?因為"我家的電器".只能識別遙控器規(guī)范,它識別不到具體的遙控器
????????遙控器規(guī)范????ControlInterfaceB??=??(遙控器規(guī)范)遙控器2;????//同上
????????電器????我家的電器??=??new??電器();
????????我家的電器.接收遙控(ControlInterfaceA)????//我用甲廠遙控器遙控我家的電器.??注意:??這里的ControlInterfaceA是不能單獨(dú)存在的,它必要依賴實現(xiàn)了"遙控器規(guī)范"的類的實例"ControlA".道理很簡單,接口是一個指針,不會被分配空間,你就無法使用,只有和一個具體類的實例聯(lián)系了,才有了可以活躍空間.
????????我家的電器.接收遙控(ControlInterfaceB)????//我用乙廠遙控器遙控我家的電器
????????
????????...
????????//下面是我的的想像,我可以用遙控器來控制導(dǎo)彈發(fā)射!
????????我的導(dǎo)彈.接收遙控(ControlInterfaceA);
????????我的導(dǎo)彈.接收遙控(ControlInterfaceB);????????
????????...
????}
--------------------------------------------------------------------
接口的執(zhí)行
好了,有了接口的概念,再來談c#程序在運(yùn)行中是如何使用接口的,如何訪問接口函數(shù).具體流程如下
????a.當(dāng)調(diào)用一個接口的函數(shù)時,系統(tǒng)會去檢查這個接口對應(yīng)實例是什么?
????b.找到這個實例后,再去找這個實例對應(yīng)的實例類是什么(什么是實例類,參看讀書筆記二)
????c.根據(jù)這個實例類去檢查該實例類是否和接口發(fā)生了捆綁(看是否實現(xiàn)了該接口,冒號后面就是)
????d.好!如果實例類實現(xiàn)了該接口(發(fā)生了捆綁)??,它就在這個實例類中找函數(shù)的定義.然后執(zhí)行該函數(shù).執(zhí)行結(jié)束.
????e.如果沒找到,他就繼續(xù)往父類找,直到找到第一個和接口捆綁的父類為止
????f.找到后,它再檢查該函數(shù)是否是虛擬函數(shù),
????g.如果不是,他馬上就執(zhí)行它??.
????h??如果是,麻煩了,系統(tǒng)又要從頭來過,去檢查該實例類的函數(shù)是否重載了該函數(shù),...具體過程見(c#讀書筆記2).
????例子:
????
using System;
namespace ConsoleApplication1
{
?/// <summary>
?/// Class1 的摘要說明。
?/// </summary>
?public interface? I
?{
??void? Func();
?}
???????? 
?class? A :I? 
?{
??public? virtual? void? Func()? 
??{? 
???Console.WriteLine("FuncA");
??}
?}
??????? 
?class? B? :? A? ,? I??? //注意這里的意思?
?{
??public? void? Func()? {? Console.WriteLine("FuncB");}
?}??????? 
??????? 
?class? C? :??? A? 
?{
??public? override? void? Func()? {? Console.WriteLine("FuncC");}
?}??? 
?class Class1
?{
??/// <summary>
??/// 應(yīng)用程序的主入口點(diǎn)。
??/// </summary>
??[STAThread]
??static void Main() 
??{
???I? a? =? new? A()? ;??? //申明了接口a,并馬上和一個類的實例發(fā)生關(guān)系了
???I? b? =? new? B()? ;??? //申明了接口b,并馬上和一個類的實例發(fā)生關(guān)系了
???I? c? =? new? C()? ;??? //申明了接口c,并馬上和一個類的實例發(fā)生關(guān)系了
???a.Func()? ;????????????? //檢查a的實例A,? 發(fā)現(xiàn)A和接口I捆綁了,所以執(zhí)行A的函數(shù)Func? ,結(jié)果:? FuncA
???b.Func()? ;????????????? //檢查b的實例B,? 發(fā)現(xiàn)B和接口I捆綁了,所以執(zhí)行B的函數(shù)Func? ,結(jié)果:? FuncB
???c.Func()? ;????????????? //家常c的實例C,發(fā)現(xiàn)其沒有和接口I捆綁,系統(tǒng)繼續(xù)找它的父類.? 發(fā)現(xiàn)A和I捆綁了,他就去找函數(shù)A,發(fā)現(xiàn)A是虛擬函數(shù),系統(tǒng)又從頭來找類的實例C,發(fā)現(xiàn)C重載(override)了Func,好了,馬上執(zhí)行該函數(shù).? 結(jié)果是FuncC;
???Console.ReadLine();
??}? 
?}
}
總結(jié)
 
                            
                        - 上一篇: 推荐文章:《同济大学软件学院万院长谈择业
- 下一篇: 今晚解决了ActiveSync不能连接到
