Реализация нескольких интерфейсов с 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
и нажмите "ОК".
См. также следующие экраны:
Ответ 2
К сожалению: НЕТ.
Мы все с нетерпением ждем поддержки Java для методов расширения
Ответ 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, потому что конструктора не будет.