Доступ к объекту класса из другого объекта класса - PullRequest
0 голосов
/ 09 ноября 2019

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

Проблема, с которой я работаю, заключается в том, что я хочу использовать класс магазина для обработкилюбые покупки во время хранения денежной переменной в классе игрока.

Можно ли получить денежное целое число в классе игрока, не создавая объект класса игрока в классе магазина?

Я думал об использовании статического целого числа для хранения данных, но из того, что я прочитал в Интернете, плохая практика использовать статические типы данных.

public class Beta {

    public static void main(String[] args) {
        Player p1 = new Player("Test");
        Shop s1 = new Shop();

        p1.setMoney(100);
        s1.clerk(p1.getMoney());

    }
}


public class Player {

    private int money;
    private String name;

    public Player(String name) {
        this.name = name;
    }   
    public int getMoney() {
        return money;
    }
    public void setMoney(int x) {
        this.money +=x;
    }
}

public class Shop {

  private int money;

  public void clerk(int x) {
       this.money = x;
       if (this.money >= total) {
           question4 = false;
           System.out.println("Your purchase was successful!");
           if (blue > 0) {
               this.addInventory("Blue", blue);
           }
           if (red > 0) {
               this.addInventory("Red", red);
           }
           if (green > 0) {
               this.addInventory("Green", green);
           }
        }
        else {
            question4 = false;
            System.out.println("Sorry you cant afford that!");
        }       
     }      
   }
}

Поэтому я сократил свой код, чтобы показать вам только основныечастей. Я хочу получить доступ к переменной p1: s money из класса player из класса Shop.

До сих пор я передавал переменную при вызове ее из main. Это единственный вариант, который у меня есть, или к нему можно получить доступ любым другим способом?

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

2 голосов
/ 09 ноября 2019

Я полагаю, что вариант, который лучше всего следует принципам объектно-ориентированного программирования, состоит в том, чтобы передать фактического игрока в качестве аргумента, а не только деньги.

В основном, передавая только деньги игрока вместо игрокаСами по себе, как просто передать свой кошелек в кассу. Вы бы этого не сделали, верно?

Таким образом, продавец может спросить клиента, достаточно ли у него денег, позвонив по номеру player.getMoney(), и клиент может сказать ему ответ.

После совершения покупки игрок может самостоятельно снять деньги со своего кошелька, когда клерк попросит их набрать player.setMoney().

Теперь вы спросили в комментарии о «передаче фактического игрока в качестве аргумента без созданияновый объект класса игрока. "Java передает аргументы по значению, а значения всех объектов - это просто адрес, который содержит информацию для этого конкретного экземпляра.

Итак, для Player p1 в бета-версии давайте представим, что вся информация p1 хранится в блоке, начиная с... скажем, адрес 21343. В этом случае переменная p1 содержит только это одно число, 21343.

Поскольку Java проходит по значению, то при вызове s1.clerk(Player player) переменная player будеттакже содержат 21343. Поскольку он редактирует элементы, содержащиеся по тому же адресу, вы, по сути, передали p1 вместо создания нового игрока. Короче говоря, клерк и метод main работают с одним и тем же объектом.

Тот факт, что Java передается по значению, также является причиной того, что передача только денег игрока не регулирует их автоматически:чем объект. Поскольку это int, когда вы передаете его клерку, вы просто говорите: «Эй, клерк, это сумма денег, с которой ты работаешь». Но продавец не имеет ни малейшего представления, кому принадлежат эти деньги, поэтому, хотя он может взять деньги или даже дать их, по сути, он просто кладет их на прилавок, и игрок обязан забрать их оттуда, когда ониготовоПередавая вместо этого игрока, клерк знает, кому принадлежат деньги, потому что он на самом деле спрашивает игрока, сколько у него денег.

0 голосов
/ 09 ноября 2019

Другим потенциальным решением было бы сделать статические переменные p1 и s1 в классе Beta. Это будет выглядеть примерно так:

public class Player
{
    public static Player p1;
    public static Shop s1;

    public static void main(String[] args)
    {
        p1 = new Player("Test");
        s1 = new Shop();

        p1.setMoney(100);
        s1.clerk(p1.getMoney());
    }
}

Оттуда вы импортируете класс Beta в Shop, а затем вызываете Beta.p1 в Shop для доступа к p1. Надеюсь, это поможет!

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