我是編程新手,我正在學習Java。 我只是想知道爲什麼我只有一個實現類時才使用接口?當只有一個實現類時,爲什麼我應該使用接口?
回答
你這樣做是爲了防止其他人訪問您的實現類獲取有關接口的詳細信息。例如,你可以隱藏你的實現類型庫中,給類型包訪問,並返回你的接口的實例到庫的用戶:
// This is what the users of your library know about the class
// that does the work:
public interface SomeInterface {
void doSomethingUseful();
void doSomethingElse();
}
// This is the class itself, which is hidden from your clients
class MyImplementation implements SomeInterface {
private SomeDependency dependency = new SomeDependency();
public void doSomethingUseful() {
...
}
public void doSomethingElse() {
...
}
}
您的客戶獲取的對象是這樣的:
public class MyFactory {
static SomeInterface make() {
// MyFactory can see MyImplementation
return new MyImplementation();
}
}
這個技巧在實現使用大量庫時變得有用。您可以高效地將庫的接口與其實現進行分離,以便用戶不必知道庫的內部依賴關係。
我沒有看到向用戶提交一個接口與向用戶提供實現類之間的區別。 「外觀和感覺」是一樣的... – Nitek
@Nitek:這裏有一個例子解決了這個問題,OP希望公開的方法暴露給最終用戶不想公開的測試:http:/ /stackoverflow.com/a/6913509/217324 –
@Nitek這不是關於外觀和感覺,而是關於將你圖書館的用戶與他們不應該看到的東西隔離。 – dasblinkenlight
接口可以由多個類來實現。沒有規定只有一個類可以實現這些。接口提供了對java的抽象。
http://www.tutorialspoint.com/java/java_interfaces.htm 你可以從這個鏈接
這是一個「鏈接 - 僅回答「,這被認爲是StackOverflow上的錯誤形式,因爲鏈接不好。問問自己,如果沒有鏈接,答案會是多麼的好。除非你準備好讓自己的答案足夠獨立,否則它應該是一個評論。 –
我不認爲提問者認爲你在一個實現類中是有限的。我認爲他們更想知道爲什麼有人會在只有一個實現類的情況下拆分接口。 –
其中一個原因是保持開放/關閉原則,其中規定您的代碼應該打開以進行擴展,但關閉以進行修改。儘管你現在只有一個實現類,但是隨着時間的推移,你將需要另一個不同的實現類。如果事先將實現提取到接口中,則只需編寫另一個實現類即。您無需修改完善的代碼,消除了引入錯誤的風險。
它可以讓您靈活地在將來添加更多實現,而無需更改引用該接口的客戶端代碼。
另一個有用的例子是在需要時模擬Java中的多重繼承。例如,假設你有一個接口MyInterface
和實施:
public interface MyInterface {
void aMethod1();
void aMethod2();
}
class MyInterfaceImpl implements MyInterface {
public void aMethod1() {...}
public void aMethod2() {...}
}
你也有一個不相關的類有自己的層次:
public class SomeClass extends SomeOtherClass {
...
}
現在你想SomeClass
是MyInterface
類型,但你還想繼承MyInterfaceImpl
中已有的所有代碼。既然你不能既延長和SomeOtherClass
MyInterfaceImpl
,可以實現接口和使用委託:
public class SomeClass extends SomeOtherClass implements MyInterface {
private MyInterface myInterface = new MyInterfaceImpl();
public void aMethod1() {
myInterface.aMethod1();
}
public void aMethod2() {
myInterface.aMethod2();
}
...
}
要尊重接口分離原則。
創建接口的決定不應該基於實現類的數量,而應該基於對象使用的不同方式的數量。對象使用的每種方式都由一個接口來表示,該接口由使用它的代碼定義。假設你的對象需要存儲在內存中,保存對象的集合中。同一個對象也需要存儲在某個持久性存儲中。
說你先實現持久性。存儲系統需要的是持久對象的唯一標識符。使用getUniqueId方法創建一個接口,稱爲Storable。然後您實現存儲。
然後,您執行該集合。您可以使用方法compareTo定義接口中存儲的對象所需的內容,如Comparable。然後您可以依賴於Comparable實現該集合。
要定義的類將實現兩個接口。
如果您正在定義的類實現單個接口,那麼該接口將不得不代表收集和存儲系統的需求。這會導致,例如:
集合的單元測試必須寫入實現Storable的對象,增加複雜度級別。如果稍後需要顯示對象時,您將不得不將顯示代碼所需的方法添加到單個接口,並修改測試的收集和存儲以實現顯示所需的方法。
我在此討論對測試代碼的影響。如果其他生產級別的對象需要存儲並且不顯示,問題會更大。項目規模越大,不尊重界面隔離原則所產生的問題就越大。
- 1. 什麼時候應該一個類實現一個接口?
- 2. 什麼時候該類應該實現一個接口,什麼時候不應該接口?
- 3. 爲什麼我應該使用Attributes而不是實現一個接口?
- 4. Typescript - 爲什麼我應該重寫所有成員來實現一個接口?
- 5. 類實現接口應該能夠只添加同一類
- 6. 有什麼辦法讓現有類型實現一個接口?
- 7. 爲什麼一個類沒有實現ISerializable接口違反MissingSerializationConstructorRule
- 8. 我有一個java類和接口,我想如果有人延長我的java類應該實現接口
- 9. 爲什麼這個接口實例在引用實現該接口的類實例時會出錯
- 10. C++。爲什麼我不能使用trait類實現接口?
- 11. 爲什麼只爲一個類使用Java接口?
- 12. 當我使用__EXPORT_SYMBOL時爲什麼只有一個部分
- 13. 如何使用接口的方法,只有當類實現它?
- 14. 爲什麼我們使用接口和抽象類,在什麼情況下應該使用abract類和接口
- 15. 爲什麼我們要實現接口?
- 16. 爲什麼沒有編譯器錯誤,當我將一個類轉換爲它沒有實現的接口?
- 17. 實現接口方法時,我應該使用@Override標記嗎?
- 18. 當實現父接口聲明一個嵌套接口時會發生什麼
- 19. 何時以及爲什麼JPA實體應該實現Serializable接口?
- 20. 我需要一個只有一個實現的接口嗎?
- 21. 爲什麼爲繼承設計的類應該很少實現Serializble接口?
- 22. 實現只有一個類或更多類的接口
- 23. 如果一個類實現了一個接口,並被分配給一個具有該接口類型的變量,那麼該對象的類型是什麼?
- 24. 爲什麼只有當我使用mutableCopy
- 25. 我應該使用什麼接口或抽象類?
- 26. 通過實現一個接口,類是否成爲該接口的「類型」?
- 27. C++當派生類沒有從接口實現函數時該怎麼辦
- 28. 類設計:類實現接口實現另一個接口
- 29. 爲什麼不能使用實現類型的接口列表?
- 30. dotnet應該只是一個類庫只暴露一個接口或一個實現
重新開放,因爲這個問題比所謂的重複更具體。 – dasblinkenlight
爲了記錄,如果任何人對「所謂的重複」是什麼感興趣,像我自己:http://stackoverflow.com/questions/1321122/what-is-an-interface-in-java –