2013-06-26 18 views
0

編輯:我的問題的簡單答案是,Java允許一個接口來擴展多個其他接口。這就是我如何在一個通用接口中將接口分組在一起的邏輯問題的答案。這個答案沒有出現在複製問題中。問題也不同,它不是創建接口組。如何將許多接口分組到一個通用的單一接口?

是否有原因在Java中,您不能將一個接口定義爲實現其他接口?我看到並且不滿意的答案是「接口本身不包含實現,那麼接口如何實現其他接口?」那麼,在我看來,這是一個弱的答案,因爲它更多的是對英語語義的點頭,而不是對場景的邏輯解釋。該場景的邏輯解釋是因爲我們可以定義類來實現許多接口,爲什麼我們不能定義一個本身代表一組接口的接口。

假設你有很多類,你想要每個類實現一個大的,通用的許多接口。就目前而言,你必須明確寫出每個班級的名單。這意味着如果以後你不得不添加另一個接口到你的許多列表中,你將不得不修改每個類。將所有界面整合到一個「超級界面」中,程序員只能在一個地方進行更改。

在你回答「make一個實現接口列表的抽象超類,並讓所有的子類擴展該超類」之前,請記住,你不能假定這些類不能擴展類。 implements關鍵字的一個好處是你可以在不改變分類的情況下調整一個類,對嗎?

我想長話短說:爲什麼程序員不能定義只是其他接口組的接口?或者,也許更好的問題是:如果我無法將接口定義爲實現其他接口,那麼我可以如何定義其他接口組的接口?

對於那些你喜歡的代碼,我要問的是,爲什麼不是做這個...

public class Foo extends ParentClass1 implements IBar1, IBar2, IBar3{ 
} 

public class Baz extends ParentClass2 implements IBar1, IBar2, IBar3{ 
} 

......那豈不是更有意義的Java允許這樣:

public interface IAllBar implements IBar1, IBar2, IBar3{ 
} 

public class Foo extends ParentClass1 implements IAllBar{ 
} 

public class Baz extends ParentClass2 implements IAllBar{ 
} 

這樣,後來,如果我創建IBar4,我只需修改IAllBar.java而不是Foo.java和Baz.java。

編輯:所以根據下面的答案,我可以定義IAllBar EXTEND所有這些接口,我會得到我想要的。我很高興有人願意閱讀整篇文章,然後跳到底部發布平均回覆。

+1

舊的問題有足夠的答案。 – DevZer0

+0

這是今天的第三個問題,聽起來像「我已閱讀過文檔,並且清楚地指出,有些編程語言不支持我需要的功能,爲什麼生活對我來說太殘酷了?」。這是問答網站,不是論壇。 –

+1

這不是重複的。網站準則說,如果現有問題的答案不正確或令人滿意,我可能會問一個問題。 – user2522434

回答

1

您可以定義一個其他接口集合的接口。它被稱爲擴展接口。您可以擴展多個接口。至於爲什麼你不能在接口中定義方法,這就是Java接口的定義方式。你所說的問題是單一繼承的後果。

但是你會很高興知道,在新的即將推出的Java 8有所謂的虛擬擴展方法的功能,解決了你所說的大的代碼庫的問題。

我個人認爲它是用於快速重構遺留代碼庫是有用的,但如果系統設計得很好,你應該能夠得到後來去掉默認實現的。過度使用此功能只會導致多重繼承的所有缺點。

+0

當你擴展多個接口時,它基本上將它們分組到一個接口不是嗎? – Thihara

+0

我沒有意識到你可以擴展多個接口!爲什麼這不是其他類似問題的答案? – user2522434

+0

鄧諾。去詢問那些回答:#的男士 – Thihara

0

根據我的理解,你的問題的說法是:

如何設計一個類層次結構,其中一組執行同一套接口等一批通過公開的接口行爲有共同的實現。

這種設計的問題可以在Java通過以下方式來解決

public abstract class AbstractAllBar implements IBar1, IBar2, IBar3{ 

/* Provide implementations of methods whose behavior remains unchanges for all of it's children classes.*/ 

} 

現在這個抽象類可以通過誰擁有一套共同的類進行擴展(通過你的示例代碼解釋)行爲由抽象類定義 AbstractAllBar

public class ParentClass1 extends AbstractAllBar { 

.......  

} 

public class ParentClass2 extends AbstractAllBar { 

.......  

} 

public class Foo extends ParentClass1 { 

} 

public class Baz extends ParentClass2 { 

} 

這種抽象類的提供框架實現骨架實施可以在收集API。你可以參考源代碼AbstractList抽象集使其更清楚。

+0

爲什麼你認爲我可以修改ParentClass1和ParentClass2?這就是我整個的觀點,包括這個例子中的那些。原來的答案是我可以在定義IBarAll接口時使用多重繼承。從字面上看,如果我只用extend來替換實現,那麼它是正確的。 – user2522434

+0

骨架類是這類問題的最佳解決方案之一。如果您對ParentClass1和ParentClass2沒有控制權(即這些類​​是任何庫的一部分),則唯一的選擇是實現在所有子類的接口中定義的每個方法。如果您可以共享更多關於ParentClass1和ParentClass2的信息,我可以探索更多選項。 –

1

接口不能被實例化 - 它們只能由類實現或由其他接口擴展。

我相信你應該做的是擴展接口。

你能做到這一點,如下圖所示:

public interface ManBearPig implements Man, Bear, Pig { 
    //interface body 
} 

然後,您可以實現ManBearPig在你需要它。

你需要記住的是接口支持多繼承。

爲了理解這個,我們考慮一下接口Man,Bear和Pig可能都包含walk()方法的想法。

如果你要在一個類中實現ManBearPig並調用walk()方法,它將同時實現Man,Bear和pig的步行方法。

+1

是的,這是答案。我不知道接口的多重繼承 – user2522434

+0

沒問題我學了很多研究這個。我無法強調你需要看看你正在分組的每個界面,並確保他們的方法不會以這種會破壞你的應用程序的方式重疊。 –

相關問題