Реализация множественного наследования с использованием двух интерфейсов, имеющих одинаковые методы - PullRequest
0 голосов
/ 19 марта 2012

Я понимаю концепцию множественного наследования, хотя я пытаюсь получить доступ к тому же методу, который был задан в двух интерфейсах. Пример: - * +1001 *

interface Interface1{ 
       int show();
       void display();
}

interface Interface2 {
int show();
void display();
}

class Impl implements Interface1, Interface2 {
       // how to override show() and display() methods such that 
       // i could access both the interfaces
}

Ответы [ 6 ]

5 голосов
/ 19 марта 2012

Поскольку у интерфейса нет определений методов.не имеет значения, какой метод show интерфейса вы переопределяете.

1 голос
/ 10 мая 2012

Вы можете реализовать 2 интерфейса с одинаковыми методами.Ошибка компиляции не возникнет.Но когда вы делаете это

class A implements Interface1, Interface2
{
}

, тогда аналогичные методы интерфейса будут переопределены методами интерфейса2.Так что в вашем классе А будет только один метод, а не два.

Пожалуйста, поправьте меня, если я ошибаюсь.

0 голосов
/ 19 марта 2012

@ RahulBorkar Я не верю, что это правильно.Если у вас есть два интерфейса с одной и той же сигнатурой, но с разными типами возвращаемых данных, вы получите тот, который основан на используемой вами ссылке.

Например, если вы создаете объект и вставляете ссылку Instance1, выполучить метод Instance1.Если вы возьмете тот же объект, поместите его в ссылку Instance2, вы получите метод Instance2.По крайней мере, так кажется на уроках.Он основан не на типе возврата, а на типе вызова.

0 голосов
/ 19 марта 2012

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

0 голосов
/ 19 марта 2012

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

Другими словами, в следующем коде оба вызова show выполняют один и тот же метод:

Impl impl = new Impl();
((Interface1) impl).show();
((Interface2) impl).show();
0 голосов
/ 19 марта 2012
Interface1 i1 = new impl();
Interface2 i2 = new impl();
i1.show();
i2.show();

В обоих случаях кажется, что вы вызываете два разных метода двух разных интерфейсов.Но так как методы интерфейсов не имеют частей тела, будет выполнен тот же метод класса Impl.

Поэтому не должно иметь значения, по какой ссылке вы вызываете эти методы.

...