Класс C реализует интерфейс B, который расширяет интерфейс A, вы можете сказать, C реализует A? - PullRequest
3 голосов
/ 22 апреля 2020

В случае, если класс C реализует интерфейс B, а интерфейс B расширяет интерфейс A. Правильно ли говорить, что класс C реализует интерфейс A?

Ответы [ 4 ]

4 голосов
/ 22 апреля 2020

Да. C может переопределить методы A.

Пример: (Это не очень хороший пример, но просто показать, что C / Chimpanzee может переопределить методы A / Animal)

interface Animal
{
    void giveBirth();
}

interface Mammal extends Animal
{
    void walk();
}

class Chimpanzee implements Mammal
{

    @Override
    public void giveBirth()
    {
        System.out.println("Chimpanzee gives birth.");
    }

    @Override
    public void walk()
    {
        System.out.println("Chimpanzee walks.");

    }
}
1 голос
/ 22 апреля 2020

Даже если я согласен с принятым ответом относительно первой части («Да»), я не согласен со второй частью «C может переопределить методы А» ,

Я считаю, что правильное описание состоит в том, что C должен реализовывать методы как A, так и B.

Например, если интерфейс A объявляет метод fooA () и B объявляет метод fooB (), тогда C должен реализовывать как fooA (), так и fooB (). В этом смысле, да, вы можете сказать, что C реализует интерфейс A (поскольку он реализует интерфейс, расширяющий A).

0 голосов
/ 22 апреля 2020

Да, можно сказать, C реализует A. Здесь очень удобен оператор instanceof:

public interface B extends A {      
    public void b();    
}

public interface A {
    public void a();        
}    

public class C implements B {

@Override
public void a() {}

@Override
public void b() {}

public static void main(String[] args) {
    C c = new C();
    System.out.println("C is A? " + (c instanceof A));
    System.out.println("C is B? " + (c instanceof B));
}

}

Результат будет:

C is A? true
C is B? true
0 голосов
/ 22 апреля 2020

Принятый ответ правильный. Из-за полиморфизма в языке Java это возможно. Однако , нужно понимать влияние на производительность использования инструкции JVM invokeDynamic вместо invokeVirtual. Последнее требует простого поиска в виртуальной таблице класса, тогда как первое требует гораздо более глубокого рекурсивного поиска по всем таблицам виртуальных методов его разработчика.

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