<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      [你必須知道的.NET] 第二回:對抽象編程:接口和抽象類

      發布日期:2007.4.12 作者:Anytao

      ?2007 Anytao.com 轉貼請注明出處,留此信息。

       本文將介紹以下內容:

      ? 面向對象思想:多態

      ? 接口

      ? 抽象類

       1. 引言

      在我之前的一篇post《抽象類和接口的誰是誰非》中,和同事管偉的討論,得到很多朋友的關注,因為是不成體系的論道,所以給大家了解造成不便,同時關于這個主題的系統性理論,我認為也有必要做以總結,因此才有了本篇的新鮮出爐。同時,我將把上貼中的問題順便也在此做以交代。

      2. 概念引入

      • 什么是接口?

      接口是包含一組虛方法的抽象類型,其中每一種方法都有其名稱、參數和返回值。接口方法不能包含任何實現,CLR允許接口可以包含事件、屬性、索引器、靜態方法、靜態字段、靜態構造函數以及常數。但是注意:C#中不能包含任何靜態成員。一個類可以實現多個接口,當一個類繼承某個接口時,它不僅要實現該接口定義的所有方法,還要實現該接口從其他接口中繼承的所有方法。

      定義方法為:


          
      public interface System.IComparable
          {
              
      int CompareTo(object o);
          }

          
      public class TestCls: IComparable
          {
              
      public TestCls()
              {
              } 

              
      private int _value;
              
      public int Value
              {
                  
      get { return _value; }
                  
      set { _value = value; }
              } 

              
      public int CompareTo(object o)
              {

                  
      //使用as模式進行轉型判斷
                  TestCls aCls = o as TestCls;
                  
      if (aCls != null)
                  {

                  
      //實現抽象方法
                  return _value.CompareTo(aCls._value);
                  }
              }
          }

       

      • 什么是抽象類?

      抽象類提供多個派生類共享基類的公共定義,它既可以提供抽象方法,也可以提供非抽象方法。抽象類不能實例化,必須通過繼承由派生類實現其抽象方法,因此對抽象類不能使用new關鍵字,也不能被密封。如果派生類沒有實現所有的抽象方法,則該派生類也必須聲明為抽象類。另外,實現抽象方法由overriding方法來實現。

      定義方法為:


      /// <summary>
      /// 定義抽象類
      /// </summary>
      abstract public class Animal
      {
          
      //定義靜態字段
          protected int _id; 

          
      //定義屬性
          public abstract int Id
          {
              
      get;
              
      set;
          } 

          
      //定義方法
          public abstract void Eat(); 

          
      //定義索引器
          public string this[int i]
          {
              
      get;
              
      set;
          } 


      /// <summary>
      /// 實現抽象類
      /// </summary>
      public class Dog: Animal
      {
          
      public override int Id
          {
              
      get {return _id;}
              
      set {_id = value;}
          } 

          
      public override void Eat()
          {
              Console.Write(
      "Dog Eats.")
          }


      3. 相同點和不同點

      3.1 相同點

      • 都不能被直接實例化,都可以通過繼承實現其抽象方法。
      • 都是面向抽象編程的技術基礎,實現了諸多的設計模式。

      3.2 不同點

      • 接口支持多繼承;抽象類不能實現多繼承。
      • 接口只能定義抽象規則;抽象類既可以定義規則,還可能提供已實現的成員。
      • 接口是一組行為規范;抽象類是一個不完全的類,著重族的概念。
      • 接口可以用于支持回調;抽象類不能實現回調,因為繼承不支持。
      • 接口只包含方法、屬性、索引器、事件的簽名,但不能定義字段和包含實現的方法;抽象類可以定義字段、屬性、包含有實現的方法。 
      • 接口可以作用于值類型和引用類型;抽象類只能作用于引用類型。例如,Struct就可以繼承接口,而不能繼承類。

       通過相同與不同的比較,我們只能說接口和抽象類,各有所長,但無優略。在實際的編程實踐中,我們要視具體情況來酌情量才,但是以下的經驗和積累,或許能給大家一些啟示,除了我的一些積累之外,很多都來源于經典,我相信經得起考驗。所以在規則與場合中,我們學習這些經典,最重要的是學以致用,當然我將以一家之言博大家之笑,看官請繼續。

      3.3 規則與場合

      1. 請記住,面向對象思想的一個最重要的原則就是:面向接口編程。
      2. 借助接口和抽象類,23個設計模式中的很多思想被巧妙的實現了,我認為其精髓簡單說來就是:面向抽象編程。
      3. 抽象類應主要用于關系密切的對象,而接口最適合為不相關的類提供通用功能。
      4. 接口著重于CAN-DO關系類型,而抽象類則偏重于IS-A式的關系;
      5. 接口多定義對象的行為;抽象類多定義對象的屬性; 
      6. 接口定義可以使用public、protected、internal 和private修飾符,但是幾乎所有的接口都定義為public,原因就不必多說了。
      7. “接口不變”,是應該考慮的重要因素。所以,在由接口增加擴展時,應該增加新的接口,而不能更改現有接口。
      8. 盡量將接口設計成功能單一的功能塊,以.NET Framework為例,IDisposable、IDisposable、IComparable、IEquatable、IEnumerable等都只包含一個公共方法。
      9. 接口名稱前面的大寫字母“I”是一個約定,正如字段名以下劃線開頭一樣,請堅持這些原則。
      10. 在接口中,所有的方法都默認為public。 
      11. 如果預計會出現版本問題,可以創建“抽象類”。例如,創建了狗(Dog)、雞(Chicken)和鴨(Duck),那么應該考慮抽象出動物(Animal)來應對以后可能出現風馬牛的事情。而向接口中添加新成員則會強制要求修改所有派生類,并重新編譯,所以版本式的問題最好以抽象類來實現。
      12. 從抽象類派生的非抽象類必須包括繼承的所有抽象方法和抽象訪問器的實實現。
      13. 對抽象類不能使用new關鍵字,也不能被密封,原因是抽象類不能被實例化。
      14. 在抽象方法聲明中不能使用 static 或 virtual 修飾符。

      以上的規則,我就厚顏無恥的暫定為T14條吧,寫的這么累,就當一時的獎賞吧。大家也可以互通有無,我將及時修訂。

      4. 經典示例

      4.1 絕對經典

      .NET Framework是學習的最好資源,有意識的研究FCL是每個.NET程序員的必修課,關于接口和抽象類在FCL中的使用,我有以下的建議:

      1. FCL對集合類使用了基于接口的設計,所以請關注System.Collections中關于接口的設計實現;
      2. FCL對數據流相關類使用了基于抽象類的設計,所以請關注System.IO.Stream類的抽象類設計機制。

      4.2 別樣小菜

      下面的實例,因為是我的理解,因此給經典打上“相對”的記號,至于什么時候晉升為“絕對”,就看我在.NET追求的路上,是否能夠一如既往的如此執著,因此我將把相對重構到絕對為止(呵呵)。 本示例沒有闡述抽象類和接口在設計模式中的應用,因為那將是另一篇有討論價值的文本,本文著眼與概念和原則的把握,但是真正的應用來自于具體的需求規范。

      設計結構如圖所示:

       

      1. 定義抽象類

          public abstract class Animal
          {
              
      protected string _name;

              
      //聲明抽象屬性
              public abstract string Name
              {
                  
      get;
              }

              
      //聲明抽象方法
              public abstract void Show();

              
      //實現一般方法
              public void MakeVoice()
              {
                  Console.WriteLine(
      "All animals can make voice!");
              }
          }


      2. 定義接口

          public interface IAction
          {
              
      //定義公共方法標簽
              void Move();
          }


      3. 實現抽象類和接口


          
      public class Duck : Animal, IAction
          {
              
      public Duck(string name)
              {
                  _name 
      = name;
              }

              
      //重載抽象方法
              public override void Show()
              {
                  Console.WriteLine(_name 
      + " is showing for you.");
              }

              
      //重載抽象屬性
              public override string Name
              {
                  
      get { return _name;}
              }

              
      //實現接口方法
              public void Move()
              {
                  Console.WriteLine(
      "Duck also can swim.");
              }

          }

          
      public class Dog : Animal, IAction
          {
              
      public Dog(string name)
              {
                  _name 
      = name;
              }

              
      public override void Show()
              {
                  Console.WriteLine(_name 
      + " is showing for you.");
              }

              
      public override string Name
              {
                  
      get { return _name; }
              }

              
      public void Move()
              {
                  Console.WriteLine(_name 
      + " also can run.");
              }

          }


      4. 客戶端實現


          
      public class TestAnmial
          {
              
      public static void Main(string [] args)
              {
                  Animal duck 
      = new Duck("Duck");
                  duck.MakeVoice();
                  duck.Show();

                  Animal dog 
      = new Dog("Dog");
                  dog.MakeVoice();
                  dog.Show();

                  IAction dogAction 
      = new Dog("A big dog");
                  dogAction.Move();
              }
          }


      5. 他山之石

      正所謂真理是大家看出來的,所以將園子里有創新性的觀點潛列于此,一是感謝大家的共享,二是完善一家之言的不足,希望能夠將領域形成知識,受用于我,受用于眾。

      • dunai認為:抽象類是提取具體類的公因式,而接口是為了將一些不相關的類“雜湊”成一個共同的群體。至于他們在各個語言中的句法,語言細節并不是我關心的重點。
      • 樺山澗的收藏也很不錯。
      • Artech認為:所代碼共用和可擴展性考慮,盡量使用Abstract Class。當然接口在其他方面的優勢,我認為也不可忽視。
      • shenfx認為:當在差異較大的對象間尋求功能上的共性時,使用接口;當在共性較多的對象間尋求功能上的差異時,使用抽象基類。

                最后,MSDN的建議是:

      • 如果預計要創建組件的多個版本,則創建抽象類。抽象類提供簡單易行的方法來控制組件版本。通過更新基類,所有繼承類都隨更改自動更新。另一方面,接口一旦創建就不能更改。如果需要接口的新版本,必須創建一個全新的接口。
      • 如果創建的功能將在大范圍的全異對象間使用,則使用接口。抽象類應主要用于關系密切的對象,而接口最適合為不相關的類提供通用功能。
      • 如果要設計小而簡練的功能塊,則使用接口。如果要設計大的功能單元,則使用抽象類。
      • 如果要在組件的所有實現間提供通用的已實現功能,則使用抽象類。抽象類允許部分實現類,而接口不包含任何成員的實現。

      6. 結論

      接口和抽象類,是論壇上、課堂間討論最多的話題之一,之所以將這個老話題拿出來再議,是因為從我的體會來說,深刻的理解這兩個面向對象的基本內容,對于盤活面向對象的抽象化編程思想至關重要。本文基本概況了接口和抽象類的概念、異同和使用規則,從學習的觀點來看,我認為這些總結已經足以表達其核心。但是,對于面向對象和軟件設計的深入理解,還是建立在不斷實踐的基礎上,Scott說自己每天堅持一個小時用來寫Demo,那么我們是不是更應該勤于鍵盤呢。對于接口和抽象類,請多用而知其然,多想而知其奧吧。

      參考文獻

      (USA)Jeffrey Richter, Applied Microsoft .NET Framework Programming

      ?2007 Anytao.com 轉貼請注明出處,留此信息。

      本貼子以現狀提供且沒有任何擔保,同時也沒有授予任何權利。
      This posting is provided "AS IS" with no warranties, and confers no rights.

      posted @ 2007-04-12 14:33  Anytao  閱讀(51913)  評論(216)    收藏  舉報
      主站蜘蛛池模板: 日本一码二码三码的区分| 中文字幕有码无码AV| 亚洲国产成熟视频在线多多| 包头市| 国产69精品久久久久乱码免费| 蜜臀91精品高清国产福利| 青青青视频免费一区二区| 亚洲精品无码日韩国产不卡av| 国产做a爱片久久毛片a片| 麻豆亚洲精品一区二区| 久久综合激情网| 午夜福利yw在线观看2020| 久久99国产一区二区三区| 看全黄大色黄大片视频| 亚洲第一精品一二三区| 亚洲中文无码永久免费| 亚洲av成人在线一区| 亚洲av无码一区二区三区网站| 国产丰满乱子伦无码专区| 国产不卡av一区二区| 亚洲码国产精品高潮在线| 好男人视频在线播放| 国产丰满乱子伦无码专区| 精品国产一区二区三区国产区| 人妻中文字幕在线视频无码| 精品偷拍一区二区三区| 国产精品国产三级国产午| 亚洲色婷婷一区二区| av新版天堂在线观看| 国产精品系列在线免费看| 一本大道久久香蕉成人网| 四虎精品国产精品亚洲精| 欧美熟妇xxxxx欧美老妇不卡| 伊人久久精品一区二区三区| 无码一区中文字幕| 一区二区三区四区国产综合| 亚洲日本乱码在线观看| 国产av精品一区二区三区| 国产精品中文字幕久久| 亚洲国产一区二区三区亚瑟| 国产精品成人午夜久久|