соединяя два класса друг с другом - PullRequest
0 голосов
/ 12 мая 2018

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

Посмотрите на этот код:

Во-первых, у нас есть класс A:

public class A {

public static void main(String[] args) {
    B b = new B();
    b.foo();
}
}

Тогда у нас есть класс B:

class B {
private int i;

interface Drawable {
    void show(int i);
}

public B() {
    this.i = 5393;
    drawable = new C();
}
private Drawable drawable;

public void foo() {
    drawable.show(this.i);
}
}

И в конце класса C:

class C implements B.Drawable {

@Override
public void show(int i) {
    System.out.println("I'm showing this method, and i = " + i);
}
}

То, что я обертываю вокруг себя, это строка:

drawable = new C();

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

В Android мы назначаем этот интерфейс для Activity (недавний патч изменил его на контекст, который является экземпляром Activity).

1 Ответ

0 голосов
/ 12 мая 2018

Это полиморфизм в работе.

В Java вы можете назначить экземпляр подкласса (или реализацию интерфейса) переменной типа суперкласс (или интерфейс).

Теперьинтерфейс на самом деле не может быть создан.Вы не можете вызвать new на интерфейсе и получить экземпляр интерфейса.Однако вы можете создать переменную типа интерфейса (в данном случае B.Drawable) и назначить ему экземпляр любого реализующего класса (в данном случае C).

Один простой способ получить некоторую интуицию об этом:

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

Но интерфейс не может быть создан.Таким образом, вы реализуете его в различных классах и создаете экземпляры этих классов .Вы можете иметь Mercedes, Ferrari, некоторые другие автомобили, со своими собственными свойствами и собственной реализацией методов.Вместо того, чтобы создавать отдельную ссылочную переменную для каждого типа автомобиля, вы просто назначаете экземпляр любого автомобиля (полученный с помощью фразы оператора new Mercedes(), new Ferrari() и т. Д.) Переменной Car.Тогда просто используйте методы, объявленные в Car.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...