簡體   English   中英

Spring為什么用接口代替抽象類?

[英]Spring Why Interfaces instead Abstract Classes?

有時,我們以某種自動方式使用Spring。 今天我正在思考和尋找追隨者。

為什么我們在春季使用此功能? @Autowired IAnimal動物;

為什么我們通常不這樣做? @Autowired Animal動物;

Animal是一個抽象類,在我們的beans.xml中,或者通過將@Autowired與Qualifier配合使用,我們可以指定所需的實現,如Dog,Cat等。

我知道我錯了,但是我想對一些抽象類方法而不是接口方法的缺點做一些解釋。

現在,如果我們要注入一些ORM實現(Ibatis或Hibernate),則使用接口注入更有意義,因為兩個提供程序都不共享抽象類,而是共享相同的Interface。但是還有其他示例嗎?

提前致謝!

在早期的Spring版本中,必須聲明接口才能使Bean使用某些需要通過接口生成代理類的功能。
最新的Spring版本沒有此限制。 因此,現在,在Spring(與沒有Spring一樣)中,一個共同的良好實踐是僅在有意義的情況下使Bean類實現接口:KISS(保持簡單和愚蠢)原理。
抽象是有代價的,我們僅出於充分的理由才願意接受。

接口的主要優點是多重繼承。 Java不允許您擴展多個類,這是有道理的。 某些語言(例如C ++和其他語言)允許這樣做,並且有一定的原因使它有用,但Java卻沒有。

但是,您可以實現多個接口。 關於接口真正什么和抽象類是什么還有一個更微妙的問題。

如果您擁有class MyClass extends MyAbstractClass ,那么您實際上是在說“所有MyClass實例都是MyAbstractClass實例”。 這適用於應用於OOP的最常見的隱喻。 例如,所有的狗實際上都是動物。

但是,接口僅定義了一些行為。 在許多編程環境中,通過事物可以做 什么而不是事物來定義事物更有意義。 例如,狗是可吠叫,可奔跑,可步行,可喂食的……在這里,您定義它可以做什么。

在您的Spring示例中,您可能並不在乎所使用的對象實際上是動物,您可能只是在乎它可以完成動物可以做的所有事情 這就是為什么首選接口的主要原因。

這確實取決於您的項目。

如果您可能要使用一個接口( IAnimal )來實現該接口的多種實現,並且要決定在打包過程中使用哪個接口,則需要使用該接口。

例如,假設您是在Windows還是Linux下, IAnimal上的實現IAnimal需要不同,在打包過程中,您可能需要准備兩種不同版本的應用程序(一個用於Windows,一個用於Linux),並且每個軟件包都包含僅適用於該平台的代碼。 在這種情況下,將在一個軟件包中包含Windows的實現,而在另一個軟件包中將包含Linux的實現。

另一種常見的情況是團隊充當“黑匣子”,其中一個團隊需要另一團隊的依賴。 在這種情況下,團隊之間達成的所有協議就是實施的“合同”(即:接口)。 您的團隊將能夠與您自己構建的“模擬”實現抗衡,而另一團隊則開發最終將被發布的實現。

否則,一般建議是“保持簡單”並僅在證明需要時添加接口。 不這樣做將導致不必要的代碼過多,這只會使每個人的生活變得困難。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM