我如何从另一个类访问对象的方法,而该类的可见性不高?

时间:2018-09-28 20:38:25

标签: java oop

我在设计小游戏时遇到问题。我有不同的类,现在我想从另一个类(正在绘制游戏)中访问对象方法。现在,这就是我写的:

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()的方法。此方法以图形为参数在其上进行绘制。所以我想从我的GameLabel类中的paintComponent()方法中调用对象方法paintPlayer()。因此,我需要当前的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类实例的每个类中的每个Object。但是我该怎么办呢?我的意思是在GameLabel类中绘制我的玩家我需要他的实例。

1 个答案:

答案 0 :(得分:0)

这并不是我要怎么做-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);
    }
}