2010-12-28 3 views
63

Мне нужно создать базовый класс, который реализует несколько интерфейсов с множеством методов, пример ниже.Реализация нескольких интерфейсов с 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. */ 

} 

ответ

74

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

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

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

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

alt text


alt text


alt text

+8

Благодаря BalusC и Лукаса для таких быстро и полезные ответы. Мой проект основан на Eclipse, поэтому я смог использовать ответ BalusC почти в режиме реального времени! Работал как шарм, и спас мне несколько часов разочаровывающей работы. Будучи новым пользователем этого форума, я удивлен и восхищен качеством участников здесь. –

+1

Добро пожаловать. – BalusC

+6

Отличный намек! Я не знал этого и буду экономить 100 часов в будущем :) Хорошо, что в stackoverflow: вы также узнаете из вопросов, которые вы не задавали себе! –

5

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

Мы все с нетерпением ждут поддержки Java для extension methods

0

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

3

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

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

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

    } 
} 

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