Как получить методы из класса, который реализует интерфейс динамически? - PullRequest
0 голосов
/ 29 мая 2018

Я работаю над простой 2D игрой на Java.Есть 2 робота: они могут двигаться, сражаться и т. Д. Эти классы реализуют один и тот же интерфейс.

Вопросы :

  1. Как создать роботов ввремя выполнения?Я имею в виду, что когда программа запущена, попросите пользователя загрузить классы, после чего используйте их методы (нажмите 1, чтобы получить свои собственные очки защиты ...), как в ролевых играх ... Я пытался делать с Reflection, но это не так.t работать с интерфейсом.

    Мой метод отражения:

    public void invokeClassMethod(String classBinaryName, String methodName) {
    
        try {
            ClassLoader classLoader = this.getClass().getClassLoader();
            Class<?> loadClass = classLoader.loadClass(classBinaryName);
    
            System.out.println("Loaded class name: " + loadClass.getName());
    
            Constructor<?> constructor = loadClass.getConstructor();
            Object classObject = constructor.newInstance();
    
            Method method = loadClass.getMethod(methodName);
            System.out.println("Invoked method name: " + method.getName());
            method.invoke(classObject);
    
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    
  2. Это хороший способ получить врага-положение ()?

Интерфейс робота:

public interface Robot {

    public String getPosition();

    public String getEnemyPosition();

    public String getArenaSize();

    public int getShield();

}

Класс робота 1:

public class Robot1 implements Robot {

    private int xCurrent;
    private int yCurrent;
    private int shield;
    private final int attack = 1;

    Robot robot2;

    public Robot1() {
    }

    public Robot1(int x, int y, int shield, Robot robot2) {
        this.xCurrent = x;
        this.yCurrent = y;
        this.shield = shield;
        this.robot2 = robot2;
    }

    @Override
    public String getPosition() {
        return "x: " + xCurrent + " y: " + yCurrent;
    }

    @Override
    public String getEnemyPosition() {
        return robot.getPosition();
    }

    @Override
    public int getShield() {
        return shield;
    }
}

Кроме того, класс Arena хранит информацию игрового поля, такую ​​как размер арены, печать и т. Д ... Если я хочу работать на этой арене (перемещение объектов робота [1] [1] ---> [3] [2]]) как связать интерфейс робота и Arena друг с другом?

Где хранить свои позиции (в конкретном классе или где-то еще)?Является ли агрегация лучшим способом? Как избежать сильной связи?

1 Ответ

0 голосов
/ 29 мая 2018
  1. Как это
public Robot loadByClassName(String classname) {
    Class<?> loadClass;
    try {
        loadClass = Class.forName(classname);
        return (Robot) loadClass.getConstructor().newInstance();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return null;

}

Не совсем, может быть, вы могли бы создать класс Position со свойствами x и y

Я думаю, что объект арены должен содержать объекты, которые находятся на арене (ваши роботы)

Мой подход - карта на арене с ключевым положением (см. 2.) и значением Robot

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