Деревья соответствующего типа - PullRequest
1 голос
/ 19 апреля 2011

Мне интересно, есть ли какой-нибудь умный способ создать 2 иерархии параллельных типов в Java.Например, у меня есть XType.XType имеет свое собственное дерево типов (около 10-20, некоторые плоские, некоторые переходят на 3 уровня).

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

Теперь у меня есть несколько ситуаций, когда я хотел бы иметь соответствующийиерархия, но с некоторым дополнительным свойством.Итак, XTypeWithProperty, AXTypeWithProperty, ...

Теперь, поскольку существует только одно наследование, для AAXTypeWithProperty невозможно иметь родителей AXTypeWithProperty и AAXType ... Конечно, я мог бы сброситьвсе к первому дереву с XType в корне и добавьте метод .getProperty(), который может возвращать ноль для типов без него.

Но я бы хотел найти безопасный для типов (столько, сколькоЯва может управлять) решением здесь.Я думал о чем-то вроде создания универсальных типов XType<WithProperty> и XType<NoProperty> и работы с ними ... но похоже, что его было бы немного утомительно поддерживать.

Есть ли лучший способ?

Ответы [ 3 ]

2 голосов
/ 19 апреля 2011

Возможно, вас заинтересует шаблон адаптера , который может помочь вам обойти проблемы хрупкого базового класса . Eclipse IDE использует это внутренне, например, для поддержки дерева моделей Java, а также дерева моделей ресурсов, а затем для адаптации элементов между двумя деревьями. Кроме того, вы можете посмотреть на инъекцию, используя Guice или AspectJ .

0 голосов
/ 19 апреля 2011

В сущности, вы говорите о смешанном классе.

В простой Java миксины невозможны, стандартное решение 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 и имеют одинаковое поведение по умолчанию.

0 голосов
/ 19 апреля 2011

Боюсь, вам нужно использовать делегирование здесь.Например:

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...