Реализация нескольких интерфейсов с Java - есть ли способ делегирования?

Мне нужно создать базовый класс, который реализует несколько интерфейсов с большим количеством методов, например ниже.

Есть ли более простой способ делегировать эти вызовы методов без необходимости создания орды дублирующих методов?

public class MultipleInterfaces implements InterFaceOne, InterFaceTwo {

    private InterFaceOne if1;
    private InterFaceTwo if2;

    public MultipleInterfaces() {
      if1 = new ImplementingClassOne();
      if2 = new ImplementingClassTwo();
    }

    @Override
    public void classOneMethodOne { if1.methodOne(); }
    @Override
    public void classOneMethodTwo { if1.methodTwo(); }
    /** Etc. */


    @Override
    public void classTwoMethodOne { if2.methodOne(); }
    @Override
    public void classTwoMethodTwo { if2.methodTwo(); }
    /** Etc. */

}

Ответ 1

Как сказано, нет способа. Тем не менее, немного достойная IDE может автогенерировать методы делегата. Например, Eclipse может это сделать. Сначала настройте шаблон:

public class MultipleInterfaces implements InterFaceOne, InterFaceTwo {
    private InterFaceOne if1;
    private InterFaceTwo if2;
}

затем щелкните правой кнопкой мыши, выберите "Источник" > "Создать методы делегата" и отметьте оба поля if1 и if2 и нажмите "ОК".

См. также следующие экраны:

alt text


alt text


alt text

Ответ 3

Существует один способ реализовать несколько интерфейсов.

Просто расширьте один интерфейс от другого или создайте интерфейс, который расширяет предопределенный интерфейс Пример:

public interface PlnRow_CallBack extends OnDateSetListener {
    public void Plan_Removed();
    public BaseDB getDB();
}

теперь у нас есть интерфейс, который расширяет другой интерфейс для использования в классе out, просто используйте этот новый интерфейс, который реализует два или более интерфейсов

public class Calculator extends FragmentActivity implements PlnRow_CallBack {

    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {

    }

    @Override
    public void Plan_Removed() {

    }

    @Override
    public BaseDB getDB() {

    }
}

надеюсь, что это поможет

Ответ 4

Там нет красивого пути. Возможно, вы сможете использовать прокси-сервер с обработчиком, имеющим целевые методы, и делегировать им все остальное. Конечно, вам придется использовать factory, потому что конструктора не будет.