Интерфейс расширяет другой интерфейс, но реализует его методы
Описание проблемы:
В Java, когда интерфейс расширяет другой интерфейс, у меня возникли несколько вопросов:
- Почему интерфейс "реализует" свои методы?
- Как он может "реализовать" свои методы, если интерфейс не может содержать тело метода?
- Как он может реализовать методы, если он просто расширяет другой интерфейс, а не реализует его?
- Какова цель интерфейса, который реализует другой интерфейс?
Это важные концепции в Java!
EDIT:
public interface FiresDragEvents {
void addDragHandler(DragHandler handler);
void removeDragHandler(DragHandler handler);
}
public interface DragController extends FiresDragEvents {
void addDragHandler(DragHandler handler);
void removeDragHandler(DragHandler handler);
void dragEnd();
void dragMove();
}
В Eclipse рядом с реализуемыми методами в DragController
есть знак "реализации".
И когда я навожу курсор, он говорит, что он реализует метод!!!
3 ответ(ов)
Интерфейс не реализует методы другого интерфейса, а только наследует их. Например, представим, что у вас есть интерфейс IVehicle
с двумя методами moveForward
и moveBack
, но также нужно учитывать самолет, который является видом транспортного средства, но с дополнительными методами, такими как moveUp
и moveDown
. В итоге у вас получается:
public interface IVehicle {
boolean moveForward(int x);
boolean moveBack(int x);
}
А для самолета:
public interface IAirplane extends IVehicle {
boolean moveDown(int x);
boolean moveUp(int x);
}
Таким образом, интерфейс IAirplane
наследует методы moveForward
и moveBack
из интерфейса IVehicle
, но также добавляет свои специфические методы. Это позволяет создать гибкую иерархию интерфейсов, где общий интерфейс может быть расширен для более специализированных реализаций.
Интерфейс определяет поведение. Например, интерфейс Vehicle
может определять метод move()
.
Автомобиль (Car) является типом транспортного средства, но обладает дополнительным поведением. Например, интерфейс Car
может определять метод startEngine()
. Поскольку автомобиль также является транспортным средством, интерфейс Car
расширяет интерфейс Vehicle
, и, следовательно, определяет два метода: move()
(унаследованный) и startEngine()
.
Интерфейс Car
не содержит реализации методов. Если вы создадите класс (например, Volkswagen), который реализует интерфейс Car, этот класс должен будет предоставить реализации для всех методов, определенных в интерфейсе: move()
и startEngine()
.
Интерфейс не может реализовывать другие интерфейсы. Он может только их расширять.
ad 1. Он не реализует свои методы.
ad 4. Цель одного интерфейса расширить, а не реализовать другой, заключается в создании более специфического интерфейса. Например, SortedMap
является интерфейсом, который расширяет Map
. Клиент, который не заинтересован в аспектах сортировки, может работать с Map
и обрабатывать все экземпляры, такие как TreeMap
, который реализует SortedMap
. В то же время, другой клиент, интересующийся аспектами сортировки, может использовать те же экземпляры через интерфейс SortedMap
.
В вашем примере вы дублируете методы из суперинтерфейса. Хотя это и допустимо, это не требуется и не меняет конечного результата. Скомпилированный код будет точно таким же, независимо от того, есть эти методы или нет. То, что показывает всплывающее объяснение в Eclipse, не имеет значения по сравнению с основной истиной, что интерфейс ничего не реализует.
"implements Runnable" против "extends Thread" в Java: что выбрать?
Type List против типа ArrayList в Java
Почему я не могу определить статический метод в интерфейсе Java?
Разница между интерфейсами Runnable и Callable в Java
Как мне следовало объяснить разницу между интерфейсом и абстрактным классом? [закрыто]