2011-04-29 116 views
16

抽象類具有具體和抽象的功能。 接口只有抽象函數。接口優於抽象類的優點是什麼?

兩者都可以覆蓋。它是

其中一個的實時優勢是什麼?

+3

請選擇*一種*語言。相應的答案*可能會非常不同。 – 2011-04-29 17:34:44

+1

@Oli - 所以我應該發佈一個新的問題 - 不同的語言如java,php,.net的OOP如何:-) – zod 2011-04-29 18:15:27

+0

不,因爲這個問題太廣泛了。關於SO的問題需要*具體*。 – 2011-04-29 18:17:41

回答

32

接口適用於當你想說「我不在乎你是如何做到的,但是你需要完成的事情。」

當你想說「我知道你應該做什麼,我知道你應該在一些/很多情況下應該如何做」時,抽象類就是用來表達的。

抽象類有一些嚴重的缺點。例如:

class House { 

} 

class Boat { 

} 

class HouseBoat extends /* Uh oh!! */ { 
    // don't get me started on Farmer's Insurance "Autoboathome" which is also a helicopter 
} 

您可以通過一個接口打通:

interface Liveable { 

} 

interface Floatable { 

} 

class HouseBoat implements Liveable, Floatable { 

} 

現在,抽象類也是非常有用的。例如,考慮AbstractCollection類。它爲所有集合定義了常見方法的默認行爲,如isEmpty()contains(Object)。如果你願意,你可以重寫這些行爲,但是......是確定一個集合是否真的可能改變的行爲?通常它會是size == 0

而且由於它不會經常變化,開發人員的時間是否真的值得每個......單一時間......對於「解決」類別中的每種方法都實施該方法?更何況當你需要對它進行更改時,如果你不得不在任何地方重新實現它,你將會有代碼重複和錯過錯誤。

+2

這對於中型/大型項目同意某些模塊將支持的接口也很有幫助。你需要知道你可以從其他模塊得到什麼,而其他模塊已經知道他們可以從模塊中得到什麼。 – user183037 2011-04-29 17:37:29

+0

同意。它適用於更輕鬆地更改實施。 – corsiKa 2011-04-29 17:39:04

+4

+1 lol at「//不要讓我開始Farmer的保險」Autoboathome「,它也是一架直升機」 – mellamokb 2011-04-29 18:02:40

15

接口很有用,因爲Java沒有多重繼承(但您可以根據需要實現儘可能多的接口)。

當您需要基類的具體行爲時,抽象類很有用。

1

一個類可以實現多個接口,而它可能只繼承一個類(抽象或具體),因爲Java不支持多重繼承。

0

您不重寫接口。你執行它。

編寫一個接口讓實現者可以實現接口以及除了繼承基類以外的其他接口。

抽象類可以部分或完全實現。標記類抽象只會阻止您實例化該類型的對象。

1

在OOP(大多獨立於具體語言)抽象類是行爲和結構的類層次結構的重用機制,它本身並不完整。 接口是獨立於具體實現而指定模塊(例如類)上的需求的機制。 所有其他區別都是技術細節,重要的是不同的用法。

0

- 方法沒有任何實現的抽象方法,當一個類包含一個或多個抽象方法,那麼它必須被聲明爲抽象類

-Interface是完全抽象的,不能有構造函數,實例和靜態塊,它只包含兩種類型的成員 1.公共抽象方法 2.公共靜態最終變量

*兩者都不能實例化,但可以創建引用。

*哪一個更適合取決於應用程序 - 接口很有用,因爲Java類不會支持多繼承,但接口可以。

- 當您需要基類的具體行爲時,抽象類很有用。

0

界面優於抽象類的主要優點是克服鑽石 問題的發生並實現多重繼承。 在java中,沒有使用類爲鑽石問題提供的解決方案。由於這個原因,多繼承是使用java中的類來阻塞的。因此,爲了實現多重繼承,我們使用接口。

2

的事實是 -

  1. Java不支持多重繼承
  2. 多個接口可以實現
  3. 一些方法在抽象類中可以實現

這些事實可以被用來傾向於有利於接口或抽象類的優勢。

如果有一個類必須與其他類共享多個行爲,則接口將獲勝。 如果方法定義必須與其他類共享/覆蓋,抽象類將獲勝。現在

0
class Animal 
{ void move(){} } 

class Bird 
{ void move(){fly} } 

class Fish 
{ void move(){swim} } 

,如果類動物就像

Animal a; 

a= new Bird(); or a = new Fish() 

這裏抽象類,抽象效果很好,但如果有喜歡的Animal a[100] 100個對象;

你不能寫new Bird().movenew Fish().move 100倍

使用的界面和寫a[i].move。它將區分爲鳥或魚,並且move()將被調用

其次它支持多繼承,因爲類A可以實現儘可能多的接口。