用介面和抽象類,與不用究竟究竟有什麼區別或好處?

iDotNetSpace發表於2008-09-28
介面和抽象類關係很緊密,它們都具有對成員的抽象。  
          對於一個抽象類,至少一個方法是抽象方法既可,這意味著它也可以具有具體方法[譯註:Concrete   Method,這只是相對於抽象方法而言,物件導向中並沒有這個概念]。  
          對於一個介面,所有的方法必須都是抽象的。  
          實現了一個介面的類必須為介面中的所有方法提供具體的實現,否則只能宣告為抽象類。  
          在C#中,多重繼承(Multiple   Inheritance)只能通過實現多個介面得到。抽象類只能單繼承[注:C#中的單繼承是指所有類作為基類的時候都只能是派生類宣告中唯一的基類,而不僅僅是抽象類]。  
          介面定義的是一個契約,其中只能包含四種實體,即方法、屬性、事件和索引器。因此介面不能包含常數(Constant)、域、操作符、構造器、析構器、靜態構造器或型別[譯註:指巢狀的型別]。  
          同時,一個介面還不能包含任何型別的靜態成員。修飾符abstract、public、protected、internal、private、virtual、override都是不允許出現的,因為它們在這種環境中是沒有意義的。  
          類中實現的介面成員必須具有公有的可訪問性。
 
舉個最簡單例子吧.假如有個構建SQL語句的類.它有一個方法獲得任意字元萬用字元.為此,我們寫個抽象類:  
  public   abstract   class   DbFactoryBase  
  {  
          //預設實現,萬用字元  
          public   virtual   string   GetMultiLikeChar()  
          {  
                  return   "%";  
          }  
  }  
  //我們寫MSSQL的實現  
  public   class   SqlSvrFactory:DbFactoryBase  
  {  
          //GetMultiLikeChar方法不需要過載  
  }  
  //我們寫Jet的實現  
  public   class   JetFactory:DbFactoryBase  
  {  
          //過載,萬用字元  
          public   override   string   GetMultiLikeChar()  
          {  
                  return   "*";  
          }  
  }  
  好處是顯而易見的,抽象類提供了預設實現,子類只在需要更改的時候才過載這個方法,我們這個類可以很容易擴充套件,比如增加對ORACLE的實現,呼叫這個抽象類的程式碼也不需要改變,但返回來的字元已經不同了.程式碼看上去也更簡潔...等等.這只是冰山之一角.建議多看看模式之類的書.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-466027/,如需轉載,請註明出處,否則將追究法律責任。

相關文章