2015-06-21 56 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

相关问题