2017-03-01 56 views
0

假設我有一個接口定義爲:多個並行接口的實現

public interface TestInterface1 { 
    public void add(); 
} 

其由類A,B和C.

實施

現在我需要減法功能僅添加到C類;對於我創建了一個新的接口TestInterface2並實現了C類:

public interface TestInterface2 { 
    public void sub(); 
} 

C類看起來是這樣的:

public class C implements TestInterface1, TestInterface2 { 
    public void add() { 
     System.out.println("I am in add"); 
    } 

    public void sub() { 
     System.out.println("I am in Sub"); 
    } 
} 

現在問題爲C的實例已經使用數百個地方像這樣:

TestInterface1 c = new C(); 

並且只有C類獲得TestInterface1的添加方法。

是否有任何方式或模式來實現C類中的兩個接口,以便創建類C的對象時,它將同時獲得TestInterface1TestInterface2的方法?

+0

如果是Java的'8'則可以使用默認'methods' – Nilesh

+0

別的由另一個延伸一個接口,然後它可能是done.Hope是有意義 – Nilesh

+4

'C C =新C();' ? –

回答

0

在我們進入這個之前,你必須考慮爲什麼你甚至使用這個接口。接口保證所有實例都使用相同的實現。如果你想要一個特定的類有一個更具體的實現,那麼這聽起來更像是一個具體類的方法,而不是一個新的接口。

無論如何,我們都可以討論您的選擇。其中一個更清潔,傳達明確的意圖;其他泥濘的東西。

第一個選項 - 表達更明確的意圖 - 是避免使用更具限制性的接口,而是使用TestInterface2表示您要使用的每個聲明C

這意味着你會在想要使用它的地方寫上TestInterface2 c = new C();。是的,你會改變它在所有你使用的地方C,但鑑於你必須有一個特別附加到C實例的方法,這個選項是最清晰的。

如果您只是在C中編寫該方法,這將是相同的方法。這兩者之間確實沒有什麼區別,我個人更傾向於如果你寫的方法只有屬於CC

第二個選項 - 哪個泥濘的東西,也需要Java 8 - 是使用默認的方法。這要求你實現它的接口在第一...

public interface TestInterface { 
    default void sub() { 
     System.out.println("I am in sub!"); 
    } 
} 

...但你可以在你的類後覆蓋它。這個泥濘的東西,因爲任何類實現TestInterface有權訪問此默認方法,這可能不是您想要的您的要求。

1

如果您可以更改接口,那麼使TestInterface1擴展另一個接口,因此使用第一個接口創建的對象可以使用其父方法。

public interface TestInterface1 extends TestInterface2{ 
    public void add(); 
}