憨厚生

          ----Java's Slave----
          ***Java's Host***

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            165 隨筆 :: 17 文章 :: 90 評(píng)論 :: 0 Trackbacks

          個(gè)人感覺這篇文章對(duì)接口解釋的挺好的!貼出來供大家欣賞一下!

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

          posted on 2006-10-30 13:01 二胡 閱讀(160) 評(píng)論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 黔东| 兴宁市| 教育| 甘孜县| 将乐县| 舒兰市| 开阳县| 社会| 安达市| 全南县| 定安县| 德保县| 榆中县| 太保市| 兴和县| 林西县| 曲麻莱县| 若羌县| 西林县| 合肥市| 教育| 留坝县| 蓬溪县| 桦甸市| 乡城县| 翁牛特旗| 平凉市| 阿坝| 安庆市| 呈贡县| 永济市| 安仁县| 乌鲁木齐县| 乌鲁木齐市| 滁州市| 崇阳县| 荆门市| 五莲县| 云梦县| 濮阳市| 丰镇市|