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

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

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

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. */

}

Ответы [ 4 ]

79 голосов
/ 28 декабря 2010

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

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

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

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

alt text


alt text


alt text

6 голосов
/ 22 мая 2014

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

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

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

    }
}

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

5 голосов
/ 28 декабря 2010

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

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

0 голосов
/ 28 декабря 2010

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

...