Реализация нескольких интерфейсов с помощью 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. */

}

person Chuck Mosher    schedule 28.12.2010    source источник


Ответы (4)


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

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

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

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

альтернативный текст


альтернативный текст


альтернативный текст

person BalusC    schedule 28.12.2010
comment
Спасибо BalusC и Lukas за такие быстрые и полезные ответы. Мой проект основан на Eclipse, поэтому я смог использовать ответ BalusC почти в реальном времени! Работал как шарм и сэкономил мне несколько часов разочаровывающей работы. Как новый пользователь этого форума, я удивлен и восхищен качеством участников здесь. - person Chuck Mosher; 28.12.2010
comment
Отличный намек! Я этого не знал и сэкономлю 100 часов в будущем :) Что хорошо в stackoverflow: вы также узнаете из вопросов, которые не задавали себе! - person Lukas Eder; 28.12.2010

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

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

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

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

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() {

    }
}

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

person Jack Gajanan    schedule 22.05.2014

К сожалению нет.

Мы все с нетерпением ожидаем поддержки Java для методов расширения.

person Lukas Eder    schedule 28.12.2010

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

person sblundy    schedule 28.12.2010