对应的树型

时间:2011-04-19 14:56:01

标签: java inheritance types

我想知道是否有一些聪明的方法可以在Java中创建2个并行类型的层次结构。例如,我有一些XTypeXType有自己的树类型(大约10-20,有些是扁平的,有些是3级)。

XType
\
 + AXType
 | \
 |  + AAXType
 |
 + BXType
 ......

现在我遇到了一些情况,我希望有一个相应的层次结构,但有一些额外的属性。所以XTypeWithPropertyAXTypeWithProperty,...

既然只有单一的继承,AAXTypeWithProperty就不可能有父母AXTypeWithPropertyAAXType ......我当然可以用{{将一切都折叠到第一棵树上1}}在root并添加一个XType方法,可以为没有它的类型返回null。

但是我想在这里找到一个类型安全(就像Java可以管理的那样)。我考虑过创建泛型类型.getProperty()XType<WithProperty>并使用它们进行操作......但看起来维护它会有点乏味。

有更好的方法吗?

3 个答案:

答案 0 :(得分:2)

您可能对adapter pattern感兴趣,这可能会帮助您解决fragile base class problem的问题。 Eclipse IDE在内部使用它来维护Java模型树和资源模型树,然后在两棵树之间调整元素。或者,您可以使用GuiceAspectJ来查看注射。

答案 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并共享相同的默认行为。