Два интерфейса с одинаковым именем метода-реализация методов

Предположим, у меня есть два интерфейса:

interface IOne {

    public void method();

}

и

interface ITwo {

    public void method();

}

конкретный класс реализует интерфейсы:

public class A implements IOne, ITwo {

    public void method(){
       //some implementation
    }
}

мои вопросы:

  1. делает единственную реализацию method() достаточно для обоих интерфейсов IOne и ITwo?
  2. если ответ 1 да, есть ли способ получить оба метода в одном классе? В этом случае нет необходимости, мы должны реализовать оба интерфейсы в одном классе.

4 ответов


для 1, ответ да. Достаточно предоставить одну реализацию для метода в классе, чтобы оба интерфейса были автоматически реализованы.

для 2, Если вам нужно иметь оба метода, то ваш класс не должен реализовывать оба интерфейса. Тем не менее, есть трюк, который вы можете использовать:

interface IOne {

    void method();
}

interface ITwo {

    void method();
}

public class A
    implements IOne, ITwo {

    // Anonymous inner class that implements ony IOne
    private final IOne one = new IOne() {

        @Override
        public void method() {
            System.out.println("IOne");
        }
    };

    // Anonymous inner class that implements ony ITwo
    private final ITwo two = new ITwo() {

        @Override
        public void method() {
            System.out.println("ITwo");
        }
    };

    @Override
    public void method() {
        System.out.println("A");
    }

    // Method that delegates to IOne
    public void methodIOne() {
        this.one.method();
    }

    // Method that delegates to ITwo
    public void methodITwo() {
        this.two.method();
    }
}

Тестирование кода:

A a = new A();
a.method(); // A
a.methodIOne(); // IOne
a.methodITwo(); // ITwo

класс A не нужно реализовывать оба интерфейса. В этом случае просто не реализуйте method() on A и оставить только анонимные внутренние классы.


Если оба метода имеют одинаковую сигнатуру, как это имеет место в вашем примере возможна только одна реализация. В этом случае невозможно реализовать две версии метода для двух интерфейсов. Так что да, примера будет достаточно.

Если подпись одинакова для двух методов, но они имеют разные типы возврата, это приведет к ошибке компиляции.

Если два метода имеют разные сигнатуры, могут и должны быть двумя разными реализациями.


достаточно ли одной реализации метода () для интерфейса IOne и ITwo?

да. Реализация одинакова для обоих abstract методы.

Если ответ 1 Да, есть ли способ получить оба метода в одном классе?

нет.


  1. да. Этот метод будет вызван, когда класс будет доступен как экземпляр IOne или ITwo.

  2. нет. Имя метода, тип возвращаемого значения и аргументы определяют сигнатуру метода, а два метода в одном классе не могут иметь одну и ту же сигнатуру. Это приводит к ошибке времени компиляции.

    одно решение, которое я предлагаю, - использовать разные имена методов для IOne.способ и ITwo.метод, тем самым делая подпись каждого метода уникальный. Это позволит вам определить два уникальных метода в одном классе.