Я пытаюсь создать несколько классов для управления приложением «модель-представление-презентатор». Я придумал следующие определения, но изо всех сил стараюсь избегать рекурсивных обобщений.
public abstract class Presenter<V extends View<...?>> {
protected V view;
public Presenter(V view) {
this.view = view;
}
// ...
}
public abstract class View<P extends Presenter<...?>> {
protected P presenter;
// ...
}
Я хотел установить взаимоотношения между двумя классами. Идея заключалась в том, что я мог бы создать экземпляр Presenter для определенного представления, при этом оба класса полагаются на полезные методы, определенные в абстрактных базовых классах, но при этом оба точно знают, какой подкласс соответствующего абстрактного класса используется.
Мои проблемы заключаются в следующем. определяя часть кода ..?
. Я не вижу способа избежать рекурсивной ситуации, такой как:
public abstract class View<P extends Presenter<V>, V extends View<Q>, Q extends...>
, и даже это определение несовместимо, поскольку класс View теперь принимает два общих параметра ... массовая путаница.
Я в основном хотел избежать классы завалены ссылками на абстрактный тип класса, что требует большого количества приведений во всех конкретных реализациях, как показано ниже:
// simpler option
public abstract class Presenter {
protected View view;
public Presenter(View view) {
this.view = view;
}
}
public class FooPresenter extends Presenter {
public FooPresenter(BarView view) {
super(view);
}
public someMethod() {
((BarView) getView()).viewSpecificMethod();
}
}
Каждая конкретная реализация этих классов должна будет постоянно преобразовывать абстрактный тип к типу, который, как она "знает", используется.