介面

介面 在 Java

1 個練習

關於 介面

interfaces 是把類別的使用和其實作解耦合的主要方法。 這種解耦合讓實作在維護上更有彈性,也有助於支援型別安全的泛型行為。

介面的語法和類別相似,差別在於方法只以簽章的形式出現,不提供主體。

public interface Language {
    String speak();
}

public interface ItalianLanguage extends Language {
    String speak();
    String speakItalian();
}

public interface ScriptConverter {
    void setVersion(String version);
    String getVersion();
    String convertCyrillicToLatin(String cyrillic);
}

實作介面的類別必須實作介面定義的所有操作。

介面通常會做到下列一項或多項事情:

  • 讓使用這些類別的程式碼能以泛型方式處理多個不同的類別。在這種情況下,介面扮演的角色和基底類別相同。舉例來說,java.io.InputStream 就是一個例子,
  • 為了特定目的公開一部分功能(例如 Comparable<T>)
  • 公開類別的公開 API,讓多個實作可以並存。其中一個例子就是測試替身
public class ItalianTraveller implements ItalianLanguage {

    public String speak() {
        return "Ciao mondo";
    }

    public String speakItalian() {
        return speak();
    }
}

public class ItalianTravellerV2 implements ItalianLanguage {

    public String speak() {
        return "migliorata - Ciao mondo";
    }

    public String speakItalian() {
        return speak();
    }
}

public class FrenchTraveller implements Language {
    public String speak() {
        return "Ça va?";
    }
}

public class RussianTraveller implements Language, ScriptConverter {

    private String version;

    public void setVersion(String version) {
        this.version = version;
    }

    public String getVersion() {
        return version;
    }

    public String speak()
    {
        return "Привет мир";
    }

    public String convertCyrillicToLatin(String cyrillic) {
        throw new UnsupportedOperationException();
    }
}

public class DocumentTranslator implements ScriptConverter {

    private String version;

    public void setVersion(String version) {
        this.version = version;
    }

    public String getVersion() {
        return version;
    }

    public String translate(String russian) {
        throw new UnsupportedOperationException();
    }

    public String convertCyrillicToLatin(String cyrillic) {
        throw new UnsupportedOperationException();
    }
}

使用上述介面與類別的程式碼可以:

  • 以相同方式對待所有說話者,不論他們使用哪種語言。
  • 讓某個負責處理書寫系統轉換的子系統運作時,不必在意它處理的是哪些具體型別。
  • 對義大利語說話者的變更完全無感,這在類別程式碼和使用者程式碼由不同團隊維護時很方便。

介面之所以廣泛用於支援測試,是因為它們讓模擬變得容易。

介面可以用extend關鍵字擴充其他介面。

介面的成員預設為 public。

介面可以包含巢狀型別:interfaces、enums 和 classes。 在這裡,外層的介面就扮演命名空間的角色。 在介面外部存取巢狀型別時,要在前面加上介面名稱,並用點號語法指出成員。

Java 在設計上不支援多重繼承,但它透過介面提供了某種形式的多重繼承。

此外,多型可以透過介面實作的概念,也支撐著整個介面機制。

透過 GitHub 編輯 連結會在新視窗或分頁中開啟

學習 介面