У меня есть один основной интерфейс и абстрактный класс, реализующий все его «производные» методы (которые могут быть написаны с использованием только абстрактных методов):
public interface Main {
public void main1(int x);
public void main2();
}
public abstract class MainAbstract implements Main {
public void main2() { main1(42); }
}
Эта функциональность может быть расширена в разных «направлениях»:
public interface SubA extends Main {
public void subA1(int x);
public void subA2();
}
public interface SubB extends Main {
public void subB1(int x);
public void subB2();
}
Теперь у меня могут быть абстрактные классы SubAAbstract
и SubBAbstract
, реализующие все "производные" методы (например, main2
в Main
).Проблема в том, что у меня могут быть конкретные реализации, которые хотят реализовать как SubA
, так и SubB
, поэтому я могу использовать только один из абстрактных классов.На самом деле проблема еще хуже, потому что у меня более 2 подчиненных интерфейсов.
Я знаю, что в Java нет способа обойтись без одиночного наследования, но я хотел бы знать, есть ли хороший способчтобы минимизировать дублирование кода в этом случае.
[Edit]
Было бы отвратительно поместить все функции в класс MainAbstract (обратите внимание, что он реализует только Main)Например,
public abstract class MainAbstract implements Main {
public void main2() {
main1(42);
}
public void subA1(int x) {
throw new UnsupportedOperationException("Not supported yet.");
}
public void subA2() {
subA1(4711);
}
public void subB1(int x) {
throw new UnsupportedOperationException("Not supported yet.");
}
public void subB2() {
subB1(-1);
}
}
Тогда конкретному классу нужно просто реализовать необходимые интерфейсы и реализовать необходимые методы:
public class MainConcrete extends MainAbstract implements Main, SubA {
public void main1(int x) {
System.out.println("main " + x);
}
public void subA1(int x) {
System.out.println("subA" + x);
}
}
Конечно, это имеет смысл, только если иерархиядовольно стабильный (это означает, что подчиненные интерфейсы известны точно раньше), но это было бы для меня.Иметь лишние видимые методы тоже нехорошо, но я не вижу способа это изменить.