2009-10-05 35 views
2

我們可以擴展一個類,但是我們不能實現一個類。我們可以實現一個接口,但不能擴展一個接口。何時使用擴展和何時使用接口?

我們應該在什麼情況下使用延伸?

+10

一個接口可以擴展一個接口 – 2009-10-05 08:12:20

回答

5

extends被用於任一延伸的基類:

class ClassX extends ClassY { 
    ... 
} 

延伸的接口:

interface InterfaceA extends InterfaceB { 
    ... 
} 

注意,接口不能實現其他接口(最可能是因爲他們沒有實現)。

Java不強加的類對接口的任何命名約定(對比IFoo在.NET世界的接口),而是使用extendsimplements之間的差異來表示的差異程序員:

class ClassA extends ClassB implements InterfaceC, InterfaceD { 
    ... 
} 

在這裏你可以清楚地看到你正在建立在ClassB現有的實現和實現方法從兩個接口。

0

extends關鍵字用於擴展具體/抽象類。通過擴展,你可以覆蓋父類的方法/繼承它們。一個類只能擴展類。 U也可以說interface1擴展了intenface2。

implements關鍵字用於實現接口。在這種情況下,你必須定義接口中指定的所有方法。一個類只能實現接口。

3

是用途的問題。接口可以用作與你的應用程序的契約,然後可以使用基類來擴展該接口,所以它是鬆散耦合的。例如注射依賴性模式

採取:

你先寫一份合同:

 public interface IProductRepository 
    { 
     IList<T> GetAllProducts(); 
    } 

然後你你的合同有一個基類擴展:

 public abstract BaseProductRepository : IProductRepository 
    { 
     public IList<T> GetAllProducts() 
     { //Implementation } 
    } 

現在你可以選擇將基礎擴展到兩個或更多具體類別:

 public class InternetProductRepository extends BaseProductRepository; 
    public class StoreProductRepository extends BaseProductRepository; 

我希望這個小例子能夠清除擴展和實現之間的差異。對不起,我沒有使用java的例子,但都是面向對象的,所以我認爲你會明白的。

感謝您的閱讀,地理


我沒有完成注射依賴性模式的代碼,但這個想法是存在的,也是有據可查的網。如果您有任何問題,請告訴我。

0

就像你說的。 java關鍵字implement用於實現使用extends擴展類的接口。

這取決於你想要做什麼。通常,當你想強制執行時(例如合同),你會使用一個接口。類似於abstract類(但是抽象類可以有非抽象方法)。

在java中記住,只能擴展一個類併爲實現類實現零到許多接口。與C#不同的是,您可以使用:擴展多個類,並且C#僅將:符號用於接口和類。

3

實際上,您可以擴展一個接口 - 在您定義另一個接口的情況下。

關於這個問題有很多類似宗教的爭論,我懷疑是否有明確的正確答案,但是對於我認爲值得承擔的事情。使用子類(即extends),當你的各種類提供相同類型的功能,並有一些共同的實現細節。使用接口實現,以表示您的類提供某些特定的功能(如接口指定的)。

請注意,兩者並不相互排斥;事實上,如果一個超類實現了一個接口,那麼任何子類都將被視爲實現該接口。

在Java中沒有多重繼承,所以一個(子)類只能有一個父類,並且仔細考慮子類以便選擇適當的父類(如果有的話);如果有其他明智的父母班級,選擇一個只反映少量班級能力的家長很可能會以挫敗感告終。舉例來說,擁有SQL Server和Oracle子類的AbstractSQLExecutor具有很大意義;但是在一個FileUtils父類中使用了一些實用方法,然後爲了繼承該功能而繼承子類,這是一個壞主意(在這種情況下,您應該聲明輔助方法是靜態的,或者持有對相反,FileUtils實例)。

此外,子類化將您與實現細節(您的父項)聯繫起來比實現接口更多。我會說,通常最好是僅僅實現接口,至少在初始階段,並且只在具有明確的層次結構的相同或類似的包中形成類的層次結構。