我想知道是否有一些聪明的方法可以在Java中创建2个并行类型的层次结构。例如,我有一些XType
。 XType
有自己的树类型(大约10-20,有些是扁平的,有些是3级)。
XType
\
+ AXType
| \
| + AAXType
|
+ BXType
......
现在我遇到了一些情况,我希望有一个相应的层次结构,但有一些额外的属性。所以XTypeWithProperty
,AXTypeWithProperty
,...
既然只有单一的继承,AAXTypeWithProperty
就不可能有父母AXTypeWithProperty
和AAXType
......我当然可以用{{将一切都折叠到第一棵树上1}}在root并添加一个XType
方法,可以为没有它的类型返回null。
但是我想在这里找到一个类型安全(就像Java可以管理的那样)。我考虑过创建泛型类型.getProperty()
和XType<WithProperty>
并使用它们进行操作......但看起来维护它会有点乏味。
有更好的方法吗?
答案 0 :(得分:2)
您可能对adapter pattern感兴趣,这可能会帮助您解决fragile base class problem的问题。 Eclipse IDE在内部使用它来维护Java模型树和资源模型树,然后在两棵树之间调整元素。或者,您可以使用Guice或AspectJ来查看注射。
答案 1 :(得分:0)
我担心你需要在这里使用代表团。例如:
public class WithProperty<T extends XType,P> {
private T object;
private P property;
public WithProperty(T obj) {
this.object = obj;
}
public T getObject() {
return object;
}
public P getProperty() {
return property;
}
public void setProperty(P property) {
this.property = property;
}
}
答案 2 :(得分:0)
基本上,你所说的是混合课程。
在普通的Java中,mixins是不可能的,标准的Java解决方案是使用策略或适配器模式(参见其他答案)
或者您可以使用AspectJ生成“真正的”混音
public interface Foo{
void isItTrue();
}
public aspect MixinAspect{
interface FooMixin extends Foo{}
public void FooMixin.isItTrue(){
System.out.println("Yup, I'm a mixin");
}
declare parents: com.yourpackage..* implements Mixin;
}
现在com.yourpackage
中的所有类都实现Foo
并共享相同的默认行为。