Поддерживаю идею с делегированием. Еще бы разнести логику по разным интерфейсам
interface Common {
void foo();
void bar();
}
interface ConcreteWithSomething {
void doSomething1();
void doSomething2();
}
interface Concrete1 extends Common, ConcreteWithSomething {}
interface Concrete2 extends ConcreteWithSomething {
void doSomething3();
}
class Concrete2Impl implements Concrete2 {
@Inject private Concrete1 delegate;
public void doSomething1() { delegate.doSomething1(); }
public void doSomething2() { delegate.doSomething2(); }
public void doSomething3() {/*...*/}
}