【資料】接口和抽象類的區別與應用

Interface和抽象類的應用

一個類可以(繼承)實現多個接口,但只能繼承一個類。接口中只能定義方法名,方法參數和返回值,以及靜態變量。而抽象類中可以有方法的實現,也可以定義非靜態的類變量。所以,當你需要多繼承特性時,那你只能使用接口;當你需要在父類中實現部分代碼(通用功能)而根據不同情況某一方法有不同的實現時,那就設計爲抽象類

    

 

我們也可以從多態性的角度來考慮是要使用接口還是用抽象類。如果預計要創建組件的多個版本,我們應該創建抽象類。這是因爲,抽象類提供簡單易行的方法來控制組件版本。通過更新基類,所有繼承類都隨更改自動更新另一方面,接口一旦創建就不能更改。如果需要接口的新版本,必須創建一個全新的接口。所以,如果創建的功能將在大範圍的全異對象間使用,則使用接口。

抽象類主要用於關係密切的對象,而接口最適合爲不相關的類提供通用功能。

一個基本原則是,首先考慮使用接口。接口可以繼承接口。抽象類可以實現(implements)接口,抽象類是可以繼承實體類,但前提是實體類必須有明確的構造函數。有個通用的設計思想,如果要設計小而簡練的功能塊,則使用接口。如果要設計大的功能單元,則使用抽象類。

接口一旦被定義和接受,就必須保持不變,以保護爲使用該接口而編寫的應用程序。接口發佈後,就不能對其進行更改。這是我們進行組件設計的一個重要原則,叫做‘接口不變性’。創建一個接口就是在創建一個定義,接口定義發佈後則永遠不能更改。接口不變性,就是爲了保護爲使用接口而編寫的現有系統。當接口設計與需求有所出入,確認需要大幅度變更時,我們應該創建新的接口。一般命名方式是,新接口可以通過在原來的接口名稱後追加一個數字‘2’來命名,以顯示出它與現有接口的關係。

一般來說,我們會把確定哪些屬性和方法屬於接口的設計過程稱爲‘接口分解’。基本準則是,應在一個接口中將緊密相關的幾個功能聚合爲一組功能太多會使接口不便於運行,而過於細分功能將導致額外的系統開銷並降低使用的簡易性。掌握分解的這個度的能力是需要不斷的在技術上進行磨鍊,以及在對每個項目深入分析與理解的基礎上才能得到的。

接口是一種非常有效的編程方法,它讓對象的定義與實現分離,從而可以在不破壞現有應用程序的情況下使對象得以完善與進化。接口消除了實現繼承的一個大問題,就是在對設計實施後再對其進行更改時很可能對代碼產生破壞。即使實現繼承允許類從基類繼承實現,在類首次發佈時仍然會使我們不得不爲設計做很多的抉擇。如果原有的設想不正確,並非總可以在以後的版本中對代碼進行安全的更改。比如,我們定義了一個基類的方法,它需要一個Integer 參數,而後來又確定該參數應該爲Long 數據類型。我們無法安全更改原始類,因爲爲從原始類派生的類所設計的應用程序可能無法進行正確編譯,因爲它會影響幾百個子類。

      辦法就是發佈接受新數據類型的更新接口。

使用接口繼承而不用類繼承的主要原因有:在應用程序要求很多可能不相關的對象類型以提供某種功能的情況下,用接口適用性會更強;接口比基類更靈活,因爲可以定義單個實現來實現多個接口在無需從基類繼承實現的情況下,接口更好;在無法使用類繼承的情況下接口是很有用的。例如,結構無法從類繼承,但它們可以實現接口。”

當你在使用inerface時,一定是用的implements裏的方法,而且經常這麼用。Listl = new ArrayList() ; List是接口,ArrayList是它的實現。這後還很有可能有個方法是這樣的 public void m1(List l){...}.這裏寫List是讓這個方法更通用些,只要是List的實現就能用。例如做網通的透明數據庫編程時,就是這麼用的,在program.cs這個文件中,爲了讓所有數據庫都通用,借用了系統提供的各種接口,如IDbconnection,IDbcommand等等,根據用戶所選數據庫的不同,接口有了不同的實現方法,如果選的是sqlserver數據庫,則 IDbconnection conn=new SqlConnection(connstr);IDbcommandcmd=new SqlCommand(conn);執行訪問數據庫的一些方法時,如ExecuteQuery(IDbcommand cmd);方法的參數就是接口,將上面的cmd傳進來就實現了對sqlserver數據庫的訪問。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章