2015-06-21 86 views
0

我有一個類使用Proxy。它看起來是這樣的:確保一個對象將實現一個接口

public class BarWrapper 
{ 
    private final Bar bar; 

    public BarWrapper(Bar bar) 
    { 
     this.bar = bar; 
    } 

    public int someMethodInBar() 
    { 
     return bar.someMethodInBar(); 
    } 

    public int someMethodInBar2() 
    { 
     return bar.someMethodInBar2(); 
    } 

    public int someMethodInBar3() 
    { 
     return bar.someMethodInBar3(); 
    } 


    // etc 
} 

Bar是一些超級類和動態類型將是一個衍生物。

我有一個接口,我希望包裝實現該接口,並繼續使用代理使用相同的方法,但Bar本身並沒有實現該接口,我沒有任何訪問它。我如何可以強制用戶通過一個動態類型不僅是一個的Bar衍生物也實現了接口,所以我不會有任何問題這樣做:

(Iinterface)bar.interfaceMethod(); 
+0

'如果拋出新的(酒吧的instanceof Iinterface!)拋出:IllegalArgumentException()'? – Dorus

+0

我更喜歡找到一種方法在編譯時強制它 –

+0

如何將構造函數更改爲'public BarWrapper(Iinterface bar)[...]'。如果你確實使用'Bar'中的任何方法,而不是'Iinterface'中的方法,我建議你將這些添加到'Iinterface'中(將接口擴展到'IinterfaceBar'中)。 – Dorus

回答

1

而不是採取對象Bar,只接受接口。

private final Iinterface bar; 
public BarWrapper(Iinterface bar) 
{ 
    this.bar = bar; 
} 

這確實需要您的代理只調用接口中的方法。您可能還想調用Bar中的方法,但不能調用Iinterface。強制執行,在編譯的時候,唯一的辦法是將這些方法添加到界面,也許擴展接口:

public interface IinterfaceBarWrapper implements Iinterface 
{ 
    public void someMethodInBar(); 
    public void someMethodInBar2(); 
    public void someMethodInBar3(); 
} 

...

private final IinterfaceBarWrapper bar; 
public BarWrapper(IinterfaceBarWrapper bar) 
{ 
    this.bar = bar; 
} 
+0

雖然這不會強制使用擴展Bar。你可以實現IinterfaceBarWrapper而不用擴展Bar。但我同意這是最清潔的OO方式。包裝器不應該關心接口方法是否通過擴展Bar來實現。 –

+0

@JBNizet你已經用你的答案覆蓋了,我不想重複已經陳述過的內容。我可以在這裏想到三個解決方案:在運行時拋出一個異常,添加一個擴展bar和接口的抽象類,或者擴展接口(如果至少使用非接口方法,否則直接使用接口)。他們都有自己的優點和缺點。 – Dorus

相關問題