3 回答

TA貢獻1772條經驗 獲得超5個贊
接口的主要優點是多重繼承。Java 不允許您擴展多個類,這是有合理原因的。一些語言允許這樣做(例如 C++ 和其他語言)并且它有用是有原因的,但 Java 不允許。
但是,您可以實現多個接口。關于什么是接口和什么是抽象類,還有一個更微妙的問題。
如果你有class MyClass extends MyAbstractClass
,你實際上是在說“的所有實例MyClass
都是”的實例MyAbstractClass
。這適用于應用于 OOP 的最常見隱喻。例如,所有的狗實際上都是動物。
然而,接口只是定義了一些行為。在許多編程上下文中,通過事物的功能來定義事物比它們是什么更有意義。例如,狗是可吠叫的、可奔跑的、可行走的、可喂食的,等等……在這里您定義它可以做什么。
對于您的 Spring 示例,您可能并不關心您正在使用的對象實際上是一個 Animal,您可能只關心它可以做 Animals可以做的所有事情。這是首選接口的主要原因。

TA貢獻2080條經驗 獲得超4個贊
在早期的 Spring 版本中,聲明一個接口可能是強制性的,以使 bean 可以使用一些需要通過接口生成代理類的功能。
最近的 Spring 版本不再有此限制。所以現在,在 Spring 中(和沒有 Spring 一樣)一個共享的良好實踐是讓一個 bean 類僅在有意義的情況下實現一個接口:KISS(保持簡單和愚蠢)原則。
抽象是有代價的,我們只有在有充分理由的情況下才愿意接受它。

TA貢獻1815條經驗 獲得超13個贊
這真的取決于你的項目。
IAnimal
如果您可能有此類接口的多個實現并且您將決定在打包過程中使用哪一個,則您希望使用接口 ( )。
例如,假設根據IAnimal
您是在 Windows 還是 Linux 下實現需要不同,在打包過程中您可能希望準備兩個不同版本的應用程序(一個用于 Windows 和一個用于 Linux)并且每個包將僅包含適用于該平臺的代碼。在這種情況下,您將在一個包中包含 Windows 的實現,而在另一種情況下,您將包含 Linux 的實現。
另一種常見情況是團隊作為“黑匣子”工作,一個團隊需要另一個團隊的依賴。在那種情況下,團隊之間達成的所有協議都是實施的“契約”(即:接口)。您的團隊將能夠針對您構建的“模擬”實現進行工作,而另一個團隊開發最終將發布的實現。
否則,一般的建議是“保持簡單”,只有在證明需要時才添加接口。不這樣做會導致代碼過多,這只會讓每個人的生活都變得困難。
添加回答
舉報