2010-04-12 77 views
0

我已經在stackoverflow上看到很多答案,但我沒有找到與我的匹配的答案。 除了所有這些差異,如果我們說一個抽象類抽象行爲的實現,而一個接口抽象實現行爲的類型,是否有意義。抽象類與設計點的接口有什麼不同?

回答

2

從設計的角度來看,主要區別是:

  • 你可以聲明在實現類的構造函數合同,通過建立在抽象基類中的受保護的構造。
  • 您可以通過基類
  • 可以使合同周圍的包裝提供的可用方法的實現(例如驗證方法參數)
  • 你可以提供一個「呼叫計劃」當您創建調用非抽象方法類型的抽象方法,由派生類實現。這對實現派生類中的算法抽象很有用,而基類實現所有處理邏輯 - 準備和驗證數據,並讓實際處理算法由派生類實現。

所以,我要說你是在該語句正確「的抽象類抽象行爲的實現,而一個接口抽象它實現了行爲的類型」

抽象類:提供必須實施一些方法(你覆蓋抽象類的方法

接口:只定義了一個合同。表明實現該接口具有的接口方法的類(你實現一個接口

例如:通過實現對現有類的接口

  • ,你只需要聲明添加界面方法到班級的合同。該類可能已經實現了該接口的所有方法,並且不需要更改現有類中的任何內容。

  • 通過將基本類型更改爲抽象類,即使與類型的抽象方法具有相同名稱的方法已存在,也需要覆蓋所有方法。

+0

不僅僅是說抽象類可以有實現和接口不能,類可以有很多接口並且只能有一個抽象基類,我覺得不同層次(家庭)的對象可以實現相同的接口,但它們不能具有相同的抽象基類。這就是爲什麼我相信,「一個抽象類抽象行爲的實現,而一個接口抽象實現行爲的類型」 – somaraj 2010-04-12 08:39:12

4

抽象類可以(並且通常會)提供一些實現。

並且接口不能提供任何實現。

+0

+1。然而,在一些語言(C++)中,沒有「接口」,因此不提供任何實現的抽象類更可能。 – ereOn 2010-04-12 07:35:27

+2

@ereOn - 當OP提到接口時,人們必須假定他使用的是具有它們的語言;) – Oded 2010-04-12 07:37:31

0

不是真的不行,因爲抽象類不需要實現任何行爲。它可能應該,因爲否則你可能會爭論它的用處,但它不必須

0

通常,抽象類實現了一些行爲,但留下了一些專門的行爲未實現。

例如,您可能會編寫一個實現網絡應用程序服務器的類,但不會實現流程函數,而是將其留給繼承類來實現。

class MyServer(Networkserver): 
    // process() is called whenever a client has sent a request 
    function process(data): 
     ... 

通過使類抽象,因此無法被實例化,對於專業化函數不必有某些適當的「默認」行爲。

0

接口=純抽象類(沒有實現抽象類)

0

單純從設計的角度,並且是語言無關,接口在類和客戶之間的合同,承諾它做什麼,不是它是如何做到的。這是「編程接口」口頭禪中暗示的用法。

由於像C++這樣的語言沒有接口,抽象類是表示它的唯一方法。對於其中接口是第一類構造的語言,任何一種方式都是可以接受的,並且在選擇中有折衷。當然,語言之間在實現上存在其他技術差異,但我不相信你會問到這些。

an interview with Erich Gamma,其中他討論了一些差異。

要回答你的問題,我認爲從理論的角度來看是有道理的。從實用的角度來看,它可能取決於你是編程中的語言:)

+0

我一直在尋找一個答案,支持我的論點「不同層次(家庭)的對象可以實現相同的接口,但他們不能有相同的抽象基類「。所以我相信「抽象類抽象行爲的實現,而接口抽象實現行爲的類型」 – somaraj 2010-04-12 08:41:29

0

兩個有特定用途按語言設計 - 抽象類被設計爲一個基類,不能被實例化。 wheras當u只是需要定義一個合同(沒有實現),每個實現類必須thrie自己的方式跟隨,則u必須使用interfaces.Also -

可以是一個基類繼承

抽象類 - 是的接口 - 無

能有impelementation

抽象類 - 有接口-No