2013-08-27 45 views
2

讓我用一個例子來說明我的問題。假設我有一個interface I,其中定義了abc()的方法。我有另外兩個類說AB它實現我並覆蓋abc()方法。

現在的問題是,爲什麼我們的用戶界面僅僅定義方法,而不是直接在類中實現,而不定義和實現接口?像...爲什麼我們使用Interface來定義方法並在Concrete Class中實現和定義它的主體?

interface I{ 
    public void abc(); 
} 
class A implements I{ 
    @Override 
    public void abc() { ... } 
} 
class B implements I{ 
    @Override 
    public void abc() { ... } 
} 

,而不是

class A { 
    public void abc() { ... } 
} 
class B { 
    public void abc() { ... } 
} 


小例子的解釋會很有幫助。謝謝。

回答

1

使用接口這裏的好處是:

我們可以說暴露abc()可以放在同型鬥式任何對象。因此,任何實現abc()的對象都是I類型的。我們可以很好地使用這些額外的信息。它的抽象的一個很好的方法:

與發動機和車輪的任何機器是車輛

2

可以,如果你喜歡,但你將無法把AB相同。沒有辦法共同獲得AB類型的對象並將它們混合在一起,但仍可以調用abc()方法。

1

想象一下,你有一個應用程序,涉及寵物。你可以有許多類型的寵物,但它們都具有相同的內部形狀和功能。所以當你有一個像getPet()這樣的函數時,你可以爲Dogs Cats等返回相同的接口。

一旦你有了Pet對象(可能是Dog或者可能是Cat),你可以執行相同的函數E.g. feedPet()將根據真實的Pet具有不同的實際代碼。

如果你沒有堅持使用接口,你將需要不同的功能爲每個不同的寵物。想象一下如果你想添加一個新的寵物,你需要改變的代碼。

對不起有點做作,但我希望你能明白。

1

使用接口可以分離接口和實現。假設我們有另一個類取決於接口abc。將此函數封裝在接口I中允許此類與abc的多個實現一起工作,而無需知道(取決於)實現abc的特定類,從而導致耦合度更低並因此更開放的系統。

請注意,某些語言,例如Python,使用「鴨子」鍵入。對參數調用o.abc()的任何函數都可以用AB來調用,而不需要以任何其他方式表示它們的通用接口。靜態類型語言需要不同的機制。

0

除了以前的答案,如果兩個AB將實施方法abc以同樣的方式,你總是可以考慮將I作爲抽象類而不是接口。因此,您可以獲得與其他答案中列出的繼承相同的好處,並且只需執行一次方法即可獲得額外的獎勵。

這裏是關於使用抽象類和接口進行進一步參考的文章: Article: JavaWorld

相關問題