| 接口與抽象類是面向?qū)ο缶幊讨袃蓚€非常重要的角色,二者各自起著非常重要的作用。但是很多初學(xué)的朋友往往會對使用接口還是抽象類存在的很大的迷惑。就我自己的一點心得,發(fā)表一下拙見。 面向?qū)ο蟮囊恍┗仡櫍?/strong> 面向?qū)ο笫澜缰杏幸粋€古老的法則:接口隔離原則,指的是不要把多個功能全部都集中在一個接口里面。接口實現(xiàn)的功能要相對單一;衍生開來可以得到另外一個結(jié)論:對一組或者稱一系列功能的實現(xiàn),盡量定義相對功能單一的小模塊來實現(xiàn)這一組功能。這其實也是解耦和的體現(xiàn)。 那這跟我們的接口和抽象類有什么關(guān)系呢?那又得擺出另外一個法則:依賴倒置原則,針對接口編程而不是針對實現(xiàn)編程。 說到這,又會有一個新的問題蹦出來,這是自相矛盾啊,既然要針對接口編程還要抽象類干嗎使?我們經(jīng)常說面向?qū)ο?,面向?qū)ο笫莵碓从谏畹摹J侨藗円褜ΜF(xiàn)實世界中的一系列方法論應(yīng)用到程序設(shè)計當(dāng)中來。 從對象這一概念的引入我們就可以揣摩這一點。人類社會中有很多對象的概念,人、車、物體。不幸的是用程序來實現(xiàn)這些對象比在概念上定義對象要難很多。(如果能達成這一共識,您可以繼續(xù)往下看,否則就請看官您移步至留言討論吧)
 MS給出開發(fā)者的建議是,用抽象類來實現(xiàn)接口。子類再繼承基類。 實例說明: 為什么要這么建議?OK,我們試著結(jié)合實際來說明一下這個問題吧。我們要造車。這個車有個基本的屬性就是能移動、還必須有輪子。那我們就設(shè)計一個接口   1
  public interface ICar 2
     { 3
  string Wheel 4
     { 5
  get; 6
  set; 7
  } 8
  void Move(); 9
  } 10
 接下來的事情,就是實現(xiàn)了。造什么車都行,繼承一下就行。隨著科技的發(fā)展,我們的車想要飛了。此時當(dāng)然不能修改這個接口,因為要遵循開閉原則。為什么要遵循?我們可以想一下,人坐上飛機能飛上天。但是也沒見誰認為人有會飛這個特性的。那也好辦,不許修改,那我再加一個接口。   1
  interface IFlyable 2
     { 3
  void Fly(); 4
  } 5
 好,我們的飛行汽車最后應(yīng)該是這樣的。    1
  class FlyCar : ICar,IAerocraft 2
     { 3
  private string wheel = string.Empty; 4
  5
  public void Fly() 6
     { 7
  Console.WriteLine("{0}車飛起來了",this.wheel); 8
  } 9
  public string Engine 10
     { 11
  get 12
     { 13
  return wheel; 14
  } 15
  set 16
     { 17
  wheel = value; 18
  } 19
  } 20
  21
  public void Move() 22
     { 23
  Console.WriteLine("{0}輪車在走",this.wheel); 24
  } 25
  } 26
 看起來很不錯,車能飛能走了。那它現(xiàn)在他的祖宗到底車還是飛行器呢?我們自己在心里辯論一下吧。估計不是很容易辯清楚。  我們前面說過,面向?qū)ο蟮乃枷雭碓从诂F(xiàn)實生活。如果把這組例子引入到現(xiàn)實中來,造會飛的汽車??隙ㄊ且谠械钠嚿厦嫦鹿Ψ?。比如你裝上噴氣動力裝置,或者裝上翅膀。這只屬于擴展功能,而不能說是繼承基類。但上面的例子可以明顯的看出,我們的飛行汽車已經(jīng)成了雜交品種。分不出到底是車還是飛行器了。這里就可以知道為什么C#和JAVA都不支持多重繼承基類了。避免雜交,減少耦合。 上面把車定義成接口并不完美,我們知道,一輛正常的車肯定能移動。這是天生的本質(zhì),不需要任何實現(xiàn)。但是上面還需要子類來實現(xiàn)這個功能。從這一點其實可以衍生出很多問題來。我們這里不做過多討論。 重新設(shè)計這個系統(tǒng)。我們可以把移動,飛行都看成是一種行為。我們的車本身擁有Move這個行為,是構(gòu)成車基類的基本要素。 總結(jié)歸納: 其實類似的例子在我們的.NET Library里隨處可見,例如Control類是繼承于Component和其他大量的接口的,而他們的基類卻是MarshalByRefObject。因為他們歸功到底又屬于引用對象。 從上面的描述中,我們可以得出結(jié)論: 接口:是某類行為或功能的抽象。是一種開關(guān)或者是契約。所以從字面上來理解就非常清楚了,西方神話中有很多和魔鬼定下契約來使自己的力量得到提升的故事。你必須定下這個契約才能得到你想要的力量。 抽象類:對具體對象的最高抽象,這個對象擁有自己的最基本特征。  所以,從整體上來講,抽象類和接口本質(zhì)上都是是系統(tǒng)的最高抽象。從實際上來講,二者抽象的對象不一樣,就這一點導(dǎo)致了他們二者的應(yīng)用的截然不同。 技術(shù)原創(chuàng)作品,請尊重他人勞動成果,轉(zhuǎn)載請注明出處;不得用于任何商業(yè)形式活動,否則將追究法律責(zé)任 |