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

У меня проблема с дизайном моей маленькой игры.У меня есть разные классы, и теперь я хочу получить доступ к Методу объектов из другого класса, который рисует Игру.Вот что я написал:

public class GameMain {

    public GameMain() {
       new GameFrame();
    }
}

Класс GameFrame:

public class GameFrame extends JFrame {

     public GameFrame() {
         new GameLabel(this);
     }

}

Класс GameLabel:

public class GameLabel extends JLabel {

    private GameFrame gameFrame;

     public GameLabel(GameFrame gameFrame) {

       }
    @Override
  public void paintComponent(Graphics g) {

  }
}

Теперь у меня есть класс, который называется Player.Этот класс Player имеет метод, который называется paintPlayer ().Этот метод использует график в качестве параметра для рисования на нем.Поэтому я хочу вызвать метод объекта paintPlayer () из моего метода paintComponent () в моем классе GameLabel.Поэтому мне нужен текущий объект Player, так что я сделал: (Старая версия моего класса GameMain)

public class GameMain {

  private GameFrame frame;
  private GameLabel label;
  private Player player;

  public GameMain() {
      frame = new GameFrame(this);
      label = new GameLabel(this, frame);
      player = new Player(this);
  }
  public GameFrame getFrame() {
     return frame;
  }

  public GameLabel getLabel() {
    return label;
  }

  public Player getPlayer() {
     return player;
  }

 }

Я только что создал все игровые объекты в своем классе GameMain и сгенерировал геттеры для объекта.Затем я просто дал всем конструкторам объектов экземпляр GameMain, чтобы я мог получить все необходимые мне объекты от моих получателей в классе GameMain.Вот что я сделал в своем классе GameLabel:

public class GameLabel extends JLabel {

   private GameMain main;

   public GameLabel(GameMain main) {
      this.main = main;
   }
   @Override
   public void paintComponent(Graphics g) {
       main.getPlayer().paintPlayer(g);
   }
 }

Все работало, но мне сказали, что это действительно плохой способ получить доступ к методу paintPlayer ().Мне сказали, что я даю много видимости каждому классу в моем шаблоне, потому что я могу получить доступ к каждому объекту из каждого класса, у которого есть экземпляр моего класса GameMain.Но что мне делать вместо этого?Я хочу нарисовать своего игрока. Мне нужен его экземпляр в моем классе GameLabel.

1 Ответ

0 голосов
/ 30 сентября 2018

Это не совсем то, как я бы это сделал - шаблоны программирования, такие как ECS, более эффективны, - но с точки зрения ОО и не приближаясь к вашим первоначальным намерениям, я бы получил следующее.

class Painter {
    Graphics g;

    public Painter(Graphics g) {
        this.g = g;
    }

    public void paint(Paintable p) {
        p.paint(g);
    }
}

interface Paintable {
    void paint(Graphics g);
}

class Player implements Paintable {
    public void paint(Graphics g) {
        // do your paint here
    }
}

class GameLabel implements Paintable {
    Player player;

    public void paint(Graphics g) {
        player.paint(g);
    }

    public void setPlayer(Player player) {
        this.player = player;
    }
}

class GameMain {
    Painter painter;
    Player player;
    GameLabel label;

    public GameMain() {
        // set up your frame and Graphics, etc.
        Graphics g = ...; 
        painter = new Painter(g);
        player = new Player();
        label = new GameLabel();
        label.setPlayer(player);
    }

    public void doIt() {
        painter.paint(label);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...