假设我有一个接口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
类中使用所有这些方法(行为),最好直接实现它并覆盖所有接口方法。