簡體   English   中英

當只有一個實現類時,為什么要使用接口?

[英]Why should I use an interface when there is only one implementation class?

我是編程新手,正在學習 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();
    }
}

當實現使用大量庫時,這個技巧變得有用。 您可以有效地將庫的接口與其實現分離,以便用戶不必了解庫內部的依賴項。

一個原因是保持開放/封閉原則,該原則指出您的代碼應該是可以擴展的,但是關閉以進行修改。 雖然你現在只有一個實現類,但是隨着時間的推移,你可能需要另一個不同的實現類。 如果事先將實現提取到接口中,則只需編寫另一個實現類即。 您無需修改​​完美的代碼,從而消除了引入錯誤的風險。

它可以讓您靈活地在將來添加更多實現,而無需更改引用該接口的客戶端代碼。

另一個有用的例子是在需要時在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已存在的所有代碼。 由於您無法擴展SomeOtherClassMyInterfaceImpl ,因此可以實現接口並使用委托:

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實現集合。

您要定義的類將實現兩個接口。

如果要定義的類實現單個接口,則該接口必須表示集合和存儲系統的需要。 這會導致,例如:

  • 集合的單元測試必須用實現可存儲的對象編寫,增加了復雜程度。

  • 如果以后需要顯示對象,則必須將顯示代碼所需的方法添加到單個接口,並修改測試以進行收集和存儲,以實現顯示所需的方法。

我在這里討論對測試代碼的影響。 如果其他生產級別對象需要存儲而不顯示,則問題會更大。 項目越大,不遵守接口隔離原則所產生的問題就越大。

我看到這篇文章中提出了很多好的觀點。 也想把我的 2 美分加到這個知識集里。

接口 鼓勵在團隊環境中進行並行開發。 可以有 2 個類 A 和 B,其中 A 調用 B 的 API。 可以有 2 個開發人員同時在 A 和 B 上工作。當 B 還沒有准備好時,A 完全可以通過與 B 的接口集成來進行自己的實現。

接口是在不同代碼層之間建立 API 契約的良好基礎。

將關注點與接口處理隱式 API 文檔分開是很好的。 參考一個並確定客戶端可以調用哪些 API 非常容易。

最后,最好在項目中練習使用接口作為標准,而不是在個案基礎上使用它(您需要多個實現)。 這確保了項目的一致性。

對於 Java 代碼的藝術,接口使 thmem 更加漂亮:)

接口可以由多個類實現。 沒有規則只有一個類可以實現這些。 接口為java提供抽象。

http://www.tutorialspoint.com/java/java_interfaces.htm您可以從此鏈接獲取有關接口的更多信息

暫無
暫無

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

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