2014-02-05 4 views
4

Я работаю с 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); 
    } 

    ... 
} 

Однако это кажется немного больным, с большим количеством методов обертки. Есть ли лучший способ справиться с этим?

+0

очень хороший вопрос. Боюсь, это будет боль :-( – Leo

ответ

0

Лучшая практика Java - предпочесть композицию над наследованием. Сохраняет вещи проще, но создает более шаблонный код. У вас есть правильная идея создания методов делегата. Хорошая Java IDE может сгенерировать для вас весь код методов делегатов шаблонов. Другие языки на JVM, такие как Scala (с чертами), делают это проще.

Смежные вопросы