Я работаю с Java API, который требует от меня реализовать ряд довольно больших интерфейсов. Однако, как правило, существует только одна или две детали, которые фактически различаются между реализациями, поэтому я сделал некоторые абстрактные базовые классы, чтобы обеспечить большую часть реализации.Java: Работа с несколькими сложными интерфейсами без дубликата кода
Однако теперь я сталкиваюсь с случаями, когда мне нужно перейти от какого-либо другого класса и/или реализовать несколько таких интерфейсов, и поэтому я не могу расширить свои абстрактные базовые классы.
В C++ я смог использовать множественное наследование, а также использовать некоторые другие трюки, как показано ниже. Однако Java не допускает использование множественного наследования или дженериков таким образом.
class MyClass : public HelperForInterfaceA, public HelperForInterfaceB {...};
class template<class BASE> MyHelper : public BASE {...};
Лучшая идея у меня прямо сейчас, чтобы иметь конкретную реализацию моего абстрактного вспомогательный класса как поле, а затем сделать все методы интерфейса вперед к этому экземпляру поля с полем, имеющим ссылку на основной объект для реализации последних деталей, если это необходимо.
class MyClass extends A implements IB, IC {
private static class B extends BAbstractHelper {
private A a;
public B(A a, int size) {
super(size);
this.a = a;
}
@Override
public boolean foo(int x, int y) {
return a.foo(x, y);
}
}
private static class C extends CAbstractHelper {
...
}
private B b;
private C c;
private int range;
@Override
public boolean foo(int x, int y) {
return x*x + y*y <= range*range;
}
@Override
public float bar(float x, int y, String s) {
return b.bar(x,y,s);
}
...
}
Однако это кажется немного больным, с большим количеством методов обертки. Есть ли лучший способ справиться с этим?
очень хороший вопрос. Боюсь, это будет боль :-( – Leo