Почему работает метод интерфейса непосредственно из интерфейса (без реализации)? - PullRequest
0 голосов
/ 24 февраля 2020

Это из среды LibGDX, я вызываю метод

Gdx.input.isKeyPressed(Input.Keys.LEFT);

Это соответствующая часть класса Gdx:

public class Gdx {

    //..
    public static Input input;
    //..
}

И соответствующая часть Input:


public interface Input {

    //..
    public class Keys { //..
    }
    //..
    public boolean isKeyPressed (int key);
    //..

}

Хуже всего то, что это работает !! Возвращает true, если я нажимаю стрелку влево.

Я не понимаю почему, похоже, что я вызываю интерфейсный метод без реализации.

Я покидаю ссылка на исходный код обоих классов:

https://github.com/libgdx/libgdx/blob/master/gdx/src/com/badlogic/gdx/Gdx.java

https://github.com/libgdx/libgdx/blob/master/gdx/src/com/badlogic/gdx/Input.java

1 Ответ

0 голосов
/ 26 февраля 2020

Из исходного кода :

/** Environment class holding references to the {@link Application}, {@link Graphics}, {@link Audio}, {@link Files} and
 * {@link Input} instances. The references are held in public static fields which allows static access to all sub systems. Do not
 * use Graphics in a thread that is not the rendering thread.
 * <p>
 * This is normally a design faux pas but in this case is better than the alternatives.
 * @author mzechner */
public class Gdx {
    public static Application app;
    public static Graphics graphics;
    public static Audio audio;
    public static Input input;
    public static Files files;
    public static Net net;

    public static GL20 gl;
    public static GL20 gl20;
    public static GL30 gl30;
}

Таким образом, вы можете видеть в документации, что этот класс содержит ссылки на экземпляры из Application, Graphics Audio и Input. Но как и где они реализованы?

LibGDX знает, на каком типе устройства оно работает, и выбирает для его реализации соответственно, например, в случае реализации Input, если мы работаем на устройстве Android, мы бы go с реализацией AndroidInput:
enter image description here

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

Gdx.input.isKeyPressed(Input.Keys.LEFT);

Мы используем правильную реализацию Input для нашего устройства и не вызываем метод из самого интерфейса.

...