Подтвердить что ты не робот

Java почему интерфейс расширяет интерфейс

Мне интересно, при каких обстоятельствах мы расширяем интерфейс от интерфейса? потому что, например,

    interface A{
          public void method1();
    }
    interface B extends A{
          public void method2();
    }
    class C implements B{
          @Override public void method1(){}
          @Override public void method2(){}
    }

Разве это не эквивалентно

    interface A{
          public void method1();
    }
    interface B{
          public void method2();     
    }
    class C imeplements A, B{
          @Override public void method1(){}
          @Override public void method2(){}
    }

Есть ли существенные причины?

4b9b3361

Ответ 1

Значительные причины полностью зависят от того, что должен делать интерфейс.

Если у вас есть интерфейс Vehicle и интерфейс Drivable, то это означает, что все транспортные средства являются управляемыми. Без наследования интерфейса каждый класс автомобилей будет требовать

class ChevyVolt implements Vehicle, Drivable
class FordEscort implements Vehicle, Drivable
class ToyotaPrius implements Vehicle, Drivable

и т.д.

Как я сказал, все автомобили управляемы, поэтому проще просто:

class ChevyVolt implements Vehicle
class FordEscort implements Vehicle
class ToyotaPrius implements Vehicle

С транспортным средством:

interface Vehicle extends Drivable

И не нужно думать об этом.

Ответ 2

Да, есть: это как наследование в другом месте. Если B - специализация A, то это должно быть написано именно так. Второй указывает, что класс просто реализует 2 интерфейса без отношения между ними.

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

Ответ 3

Да, есть одна большая разница.

В вашем первом примере ваш новый интерфейс B определен как расширяющийся от A, поэтому в будущем любой класс, который реализует B, автоматически реализует A. В основном вы говорите компилятору "вот что значит быть A, вот что значит быть B, а oh, , кстати, все B тоже A!" Это позволяет вам говорить такие вещи, как...

class C implements B {
    ... you implement all of the methods you need...
    ...blah...
    ...blah...
}
A myNewA = new C();

и это отлично работает.

Но во втором примере вы не объявляете B для расширения A, поэтому приведенный выше код не будет работать. Когда вы пытаетесь назначить экземпляр (второго типа) C в ссылку для A, он будет жаловаться, потому что вы не сказали компиранту, что "все B - это действительно A". (т.е. нет отношения между B и C)

Ответ 4

Если вы не хотите, чтобы B был реализован без реализации A, вы можете сделать B extends A.

Пример:

interface LivingThing{
public void eat();
}

interface Dog extends LivingThing{
public void Bark();
}

Возможно быть живым, не будучи собакой, но нельзя быть собакой, не будучи живым. Так что, если он может лаять, он также может есть, но противоположное не всегда верно.

Ответ 5

То, что вы говорите, правильно, но это не просто о том, чтобы выполнить нашу работу, что, если это так:

1) Представьте, что существует 10 интерфейсов, не разработанных в одно и то же время. Напр. интерфейс AutoCloseable в Java 7. Добавлена ​​новая функция автоматического закрытия, она отсутствовала до Java 6.

2) Если вы разработали интерфейс C, который является интерфейсом маркера, и вы хотите, чтобы все классы, полученные из данного класса B, были отмечены, лучшим решением было бы использовать B extends C, а не идти и помещать инструменты C во всем мире.

Есть еще много причин. Если вы посмотрите на большую картину классов и иерархии, вы можете получить ответ самостоятельно.

Счастливая Помощь Dharam

Ответ 6

Основное отличие здесь в том, что в первом примере B есть A, а затем некоторые. Это означает, что интерфейс B вызывает метод1() и method2(), где, как и во втором, A и B являются отдельными (интерфейс B НЕ ВЫКЛЮЧАЕТ метод method1()), а класс C реализует A и B. В обоих случаях класс C переопределяет метод1() и method2(). Надеюсь, это поможет!