2017-01-25 16 views
1

У меня есть эти три интерфейса как часть API интерфейса Fluent (где много метод построения цепочки происходит):Как повторно использовать распространенный расширенный интерфейс в Java?

interface VerifierA extends VerifierC { 

     VerifierA method1(); 
     // other methods elided 
    } 

    interface VerifierB extends VerifierC { 
    VerifierB method1(); 
     // other methods elided 
    } 

    interface VerifierC { 
    VerifierA commonMethod(); 
    } 

commonMethod() Объявив, как VerifierA я могу тогда методы цепных commonMethod().method1() но не commonMethod().method2();

Как я могу получить commonMethod() в VerifierC Вернуться к обоим VerifierA или VerifierB по мере необходимости?

+1

Я думаю, что это уже задавала в http://stackoverflow.com/questions/1069528/method-chaining-inheritance-don-t-play-well- или http://stackoverflow.com/questions/9655335/method-chaining-how-to-use-getthis-trick-in-case-of-multi-level-inheritance – pringi

+0

Прочитав указанный ответ, я боюсь, я не могу применить его к моей ситуации, состоящей только из интерфейсов ... – Andrejs

+0

Почему вы не просто позволяете commonMethod возвращать VerifierC и переопределять в VerifierB, чтобы вернуть VerifierB и VerifierA, чтобы вернуть VerifierA? – david

ответ

2

вы могли бы решить эту проблему с обобщениями:

interface VerifierA extends VerifierC<VerifierA> { 
    VerifierC<VerifierA> method1(); 
} 

interface VerifierB extends VerifierC<VerifierB> { 
    VerifierC<VerifierB> method1(); 
} 

interface VerifierC<T> {  
    T commonMethod(); 
} 
+0

+1 Я собирался ответить тем же. Должен ли возвращаемый тип VerifierB # method1 быть 'VerifierC '? –

+0

Должно ли в интерфейсе 'VerifierB'' method1() 'иметь' 'then? – Andrejs

+0

@ luc14n0 определенно. благодаря! –