Интерфейсы и отправка динамических методов

#java #overriding

#java #переопределение

Вопрос:

Обычное переопределение (без использования интерфейсов)

 class A {
    int x = 0;
    void show() {
        System.out.println("In A. x : "   x);
    }
}

class B extends A {
    void show() {
        System.out.println("In B. x : "   x);
    }
}

class C extends A {
    void show() {
        System.out.println("In C. x : "   x);
    }
}

class Test {
    public static void main(String args[]){
        A obj = new B();
        obj.show();
        obj = new C();
        obj.show();
    }
}
 

Это то же самое, что и с интерфейсами:

 interface A {
    int x = 0;
    void show();
}

class B implements A {
    public void show() {
        System.out.println("In B. x : "   x);
    }
}

class C implements A {
    public void show() {
        System.out.println("In C. x : "   x);
    }
}

class Test {
    public static void main(String args[]){
        A obj = new B();
        obj.show();
        obj = new C();
        obj.show();
    }
}
 

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

Комментарии:

1. Поскольку множественное наследование невозможно в java

2. Вы также можете предоставить реализацию show() в A, поэтому производным классам не нужно будет предоставлять переопределение, где, поскольку интерфейс не может.

3. Добавление к точке Марка. С вашим интерфейсом вы не можете печатать «В A. x:».

Ответ №1:

Для этого необходимо учитывать некоторые моменты :

  1. Интерфейс предоставляет вашему классу возможность расширения с другим классом.Как вы знаете, вы не можете расширить несколько классов, но вы можете реализовать несколько интерфейсов (для достижения множественного наследования).
  2. Расширяя класс, вы не можете заставить подкласс переопределять метод define в суперклассе.Во время реализации интерфейса принудительно реализуйте свой метод в подклассе.
  3. Это зависит от реализации, которая будет вам нужна. Вы хотите, чтобы подкласс должен был реализовывать метод, чем вам нужно использовать дизайн интерфейса, в то время как вы не будете беспокоиться о переопределении подкласса методом суперкласса или нет, чем вы можете использовать extends design.

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

Ответ №2:

Викингстеве прав, но я добавлю еще немного деталей.

Существует разница между наследованием типов и наследованием реализации. В Java вы можете иметь наследование нескольких типов, но не множественное наследование реализации.

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

Ответ №3:

Интерфейсы и суперклассы предназначены для разных вариантов использования :

  • суперклассы позволяют разложить на множители общие методы (но в java класс имеет только один родительский класс)
  • интерфейсы объявляют константы и / или сигнатуры методов, но класс может реализовать столько методов, сколько ему нужно

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