Отношения между классами, реализующими один и тот же интерфейс

Я в значительной степени новичок java, и я пришел, чтобы задать форум stackoverflow для одного простого вопроса. Я уже проверил подобный вопрос здесь на SO, но не нашел желаемого ответа, ссылка:существует ли какая-либо связь между классом, реализующим интерфейс, и этим интерфейсом?

мы знаем, что если кошки выходит животные, здесь есть связь. Так что кошка-Это животное ( но не обязательно иначе. Животное тоже собака..). Мы знаем это отношение как "есть-а" -наследование.

Если у нас есть еще два класса: девушки и конфеты и если класс девушка держит экземпляр конфеты, то мы называем это отношение "имеет-а" -состав, потому что мы можем сказать, что девушки-это конфеты.

поправьте меня, если я сделал что-то неправильно С выше примеры.

в любом случае мой вопрос в том, есть ли какая-то связь между объектами классов, которые реализовать тот же интерфейс? Скажем:

public class A implements InterfaceA {}

public class B implements InterfaceA {}

Если есть какая-то связь, как мы можем использовать эту связь? Спасибо за ваши ответы заранее..

EDIT: для тех, кто думает, что нет отношений, у меня есть книга "java как программировать девятое издание", и есть диаграмма UML, которая показывает классы, которые реализуют тот же интерфейс в "отношениях" ?

изображение:

enter image description here

4 ответов


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

Если вы попытаетесь выполнить приведение от одного типа объекта к другому типу объекта, вы получите ClassCastException.

EDIT:

ваша диаграмма UML предполагает, что существует связь между интерфейсом и классом (IS-A), но не между двумя классами, которые реализуют тот же интерфейс. Нет строки с символом отношения между классами (как вы видите между классом и интерфейсом)


это означает, что ваши классы имеют аналогичное поведение, описанное методами интерфейса.

например, рассмотрим два класса: Fish и Bird. Они оба могут реализовать интерфейс Moveable как:

inteface Moveable{
    void move(int x, int y, int z);
}

class Fish implements Moveable{
    public void move(int x, int y, int z){
       swim(x, y, z); 
   }
    private void swim(int x, int y, int z){
      //a method describing how the fish swims
    }
}

class Bird implements Moveable{
    public void move(int x, int y, int z){
       fly(x, y, z); 
   }

    private void fly(int x, int y, int z){
      //a method describing how the bird flies
    }
}

вы можете вызвать поведение, указанное методами интерфейса, например:

Moveable bird = new Bird();
Moveable fish = new Fish();

bird.move(10,10,10);
fish.move(10,10,-10);

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


связь между реализацией класса и интерфейсом, а интерфейс также является отношением "is-a", таким же, как расширение из класса.

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

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


нет формального имени для связи между двумя классами, которые реализуют один и тот же интерфейс.

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

Если бы вы хотели распространить эту антропоморфную метафору на интерфейсы, вы могли бы назвать две реализации интерфейса look-alikes, возможно.