有没有办法在Java中模拟mixins或traits?基本上,我需要一种方法来进行多重继承,以便我可以向多个类添加共同的业务逻辑。
我会将所有业务逻辑封装到一个名为BusinessLogic
的新类中,并让需要使用BusinessLogic
的每个类调用该类。如果你需要一个根类层次结构,使得调用BusinessLogic
的类只有一个根类,那么你还需要创建一个接口(BusinessLogicInterface
?)。
伪代码如下:
interface BusinessLogicInterace
{
void method1();
void method2();
}
class BusinessLogic implements BusinessLogicInterface
{
void method1() { ... }
void method2() { ... }
}
class User
extends OtherClass
implements BusinessLogicInterface
{
BusinessLogic logic = new BusinessLogic();
@Override
void method1() { logic.method1(); }
@Override
void method2() { logic.method2(); }
}
这并不是最漂亮的实现方式,用来解决多重继承的缺失,在接口有很多方法时会变得非常麻烦。 很可能,你希望尝试重新设计你的代码,避免需要使用混合。
今天您是否想要发挥纯粹的对象思维?
您是否认为需要一些复合导向编程?
如果是这样,那么您需要了解Apache Polygene(曾用名Qi4J,后改名为Zest和/或Apache-Zest)。
更新于2022年:虽然它已经停止更新,但仍然很有用。
interface BusinessLogicInterface {
void method0();
class DefaultImpl {
private DefaultImpl() {
}
public static void method1(BusinessLogicInterface self) { ... }
public static void method2(BusinessLogicInterface self) { ... }
}
void method1();
void method2();
}
class User extends OtherClass implements BusinessLogicInterface {
@Override
void method0() { ... }
@Override
void method1() { BusinessLogic.defaultImpl.method1(this); }
@Override
void method2() { BusinessLogic.defaultImpl.method2(this); }
}
QI4J 允许您使用混合功能
Java的解决多重继承的方法是实现多个接口。当然,这意味着您将获得方法声明,但不包括逻辑。
您可以通过组合来模拟mixin:您的Java类可以定义表示执行某些通用业务逻辑的其他类的成员变量。
在设计Java类时,我并没有发现缺乏C++风格的多重继承会抑制我的架构设计。您会找到一种实现您想要的功能的方法。
从Java-8开始,添加了默认接口方法。这与Java中的多继承接口一起使用应该允许某种混合。显然,这些接口必须独立操作。因此,会有显著的限制。