Минимизируйте дублирование кода при реализации нескольких интерфейсов - PullRequest
3 голосов
/ 30 мая 2011

У меня есть один основной интерфейс и абстрактный класс, реализующий все его «производные» методы (которые могут быть написаны с использованием только абстрактных методов):

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);
    }

}

Конечно, это имеет смысл, только если иерархиядовольно стабильный (это означает, что подчиненные интерфейсы известны точно раньше), но это было бы для меня.Иметь лишние видимые методы тоже нехорошо, но я не вижу способа это изменить.

Ответы [ 3 ]

2 голосов
/ 30 мая 2011

Я хотел бы знать, есть ли хороший способ минимизировать дублирование кода в этом случае.

Я считаю, что стандартответом будет использование состав объекта .

Вопросы, связанные с этим:

0 голосов
/ 03 апреля 2012

С помощью библиотеки байтов-кодов objweb asm вы можете написать утилиту, которая считывает код из всех методов и полей всех ваших реализующих классов и помещает их в один класс.

Утилита будет выглядеть примерно так открытый класс ClassUtil {

public static Class<?> unifyClass(Class<?>...classes) {
    return ...;
}
}

And then

Class<?> subAllClass = unifyClass(SubA.class, SubB.class, ...);
0 голосов
/ 30 мая 2011

Вывести работу на служебные классы, строителей и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...