正在将接口连接到类成员



假设我有一个接口A和一个实现它的类B。现在,我还有一些C类,它扩展了D类(这意味着它不能也扩展B),但我也需要接口A的功能。

我知道的解决方案是让a的一个成员在C中由B实例化(它将实现a),并且当实现a的函数时,从a的成员调用匹配函数。

有没有办法在A的功能和C内部的成员之间建立某种联系?(这样java就会知道,每次需要从a调用函数时,它都会直接从a成员那里运行匹配的函数,而无需我为a的每个函数编写代码)

非常感谢每一位帮助者。。。

否。如前所述,授权必须手动执行。

话虽如此,您有几个选项可以简化它:如果您使用Eclipse,请选择Source | Generate Delegate Methods并选择您的成员变量。Eclipse将为您生成所有的委托方法。我不知道其他IDE,但如果NetBeans等人没有类似的功能,我会感到惊讶。

另一种选择是,如果你真的想装饰现有的收藏类,可以考虑谷歌番石榴的谷歌番石榴收藏助手。

最后,但同样重要的是,您可以考虑重新构造代码,并使用Advice装饰类。建议源于面向方面编程(AOP),通常使用代理机制来丰富原始目标类。这是一种相当先进的技术,但如果您决心走这条路,请查看Spring的AOP支持。

综上所述,这里是您的类层次结构:

package common;
public interface A 
{
  void doStuff();
}
package commom.impl;
public class B implements A 
{
  void doStuff() {}
}
package real.service;
public class D 
{
  void doSomeRealStuff() {}
}
package real.service;
public class C extends D 
{
  void doSomeRealStuffForGood() {}
}

假设每个类都在其自己的源文件中声明

回想一下OP,我假设您需要C中的B内容,而不是真正的A内容。因为A只不过是一个契约,您需要在C类中获取真正的implementing类,以便调用.上声明的方法

在这种情况下,您可能需要使用Inversion of Responsibility方法,以便在C类中声明类型为B的instacne,然后将B中的每个方法与具有相同签名的方法分层,只会将实际调用委托给实例成员:

package real.service;
import common.A;
import common.impl.B;
public class C extends D 
{
  private A delegate;
  public C ()
  {
    delegate = new B();
  }
  void doStuff() {
    delegate.doStuff(); // Call the real delegate method when doStuff is called on an isntance of C.
  }
  void doSomeRealStuffForGood() {}
}

请注意,这是一个合法的OO概念,因为您遵循的是HAS-a,尽管有些人可能认为它是高度耦合的。

否则,如果您没有绑定到B类,并且您可能会将declare方法放在其中用于其他一些方法,那么您可以根据需要声明一个实现A接口的内部类。

编辑:

Java不支持多重继承,尽管您在A接口中提供了一个通用约定,所以如果您需要在C类中使用所有这些方法(行为),最好直接实现它并覆盖所有接口方法。

最新更新