#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:
Для этого необходимо учитывать некоторые моменты :
- Интерфейс предоставляет вашему классу возможность расширения с другим классом.Как вы знаете, вы не можете расширить несколько классов, но вы можете реализовать несколько интерфейсов (для достижения множественного наследования).
- Расширяя класс, вы не можете заставить подкласс переопределять метод define в суперклассе.Во время реализации интерфейса принудительно реализуйте свой метод в подклассе.
- Это зависит от реализации, которая будет вам нужна. Вы хотите, чтобы подкласс должен был реализовывать метод, чем вам нужно использовать дизайн интерфейса, в то время как вы не будете беспокоиться о переопределении подкласса методом суперкласса или нет, чем вы можете использовать extends design.
Я надеюсь, что это даст вам четкое представление о дизайне обоих.
Ответ №2:
Викингстеве прав, но я добавлю еще немного деталей.
Существует разница между наследованием типов и наследованием реализации. В Java вы можете иметь наследование нескольких типов, но не множественное наследование реализации.
Это означает, что класс может реализовывать несколько интерфейсов и наследует тип от каждого из этих интерфейсов. Объект, созданный из этого класса, в основном относится ко всем этим типам сразу. Но вы можете расширить только один другой класс и наследовать его реализацию.
Ответ №3:
Интерфейсы и суперклассы предназначены для разных вариантов использования :
- суперклассы позволяют разложить на множители общие методы (но в java класс имеет только один родительский класс)
- интерфейсы объявляют константы и / или сигнатуры методов, но класс может реализовать столько методов, сколько ему нужно
Интерфейсы необходимы при проксировании, потому что прокси может только реализовывать интерфейс и не расширяет классы. И прокси-серверы широко используются в таких фреймворках, как Spring, для простого аспектно-ориентированного программирования.