0

Помогите пожалуйста разобраться как правильно организовать передачу экземпляров класса (объектов) между вызовами событий формы? К примеру, есть класс Player.

class Player
{
    private int _health;
    private int _attack;
    public int CombatPower { get; private set; }
    public int OpenedChests { get; private set; }
public Player(int health, int attack)
{
    _health = health;
    _attack = attack;
    CombatPower = health * 2 + attack * 4;
    OpenedChests = 0;
}

public void OpenChest()
{
    OpenedChests += 1;
}

}

Допустим где-то будет создан экзмемпляр этого класса player. Сейчас создаю его при загрузке формы

 private void Sim_Load(object sender, EventArgs e)
 {
     Player player = new Player(100, 0);
 }

Дальше, допустим, при вызове события button1_Click я хочу выполнить метод player.OpenChest()

private void button1_Click(object sender, EventArgs e)
{
    player.OpenChest();
}

Но как это сделать? player был создан при загрузке формы, дальше он уничтожается потому что является локальным. Мне же надо передать как-то между этими событиями созданный ранее экземпляр моего класса Player. Можно было бы конечно создать внутри события button1_Click, но я допустим хочу создать его именно при загрузке, а потом передавать этот объект в другие события формы. Помогите пожалуйста разобраться как правильно это сделать?

Melv
  • 1
  • 2
  • https://ru.stackoverflow.com/a/835223/220553 – EvgeniyZ Nov 21 '23 at 12:31
  • @EvgeniyZ что-то я не понимаю как мне это может помочь. Зачем мне создавать еще один класс, делать там поле типа моего первого класса и делать конструктор для него с входными данными в виде типа моего первого класса? Я же спросил о другом. Запускается форма, я должен где-то создать экземпляр моего класса и дальше работать с ним. Может я его не в том месте объявляю изначально? Вот например, если объявить его при загрузке формы (event-load), то пока я внутри этого метода - я могу с ним работать, но как только я выйду из тела метода - экземпляр пропадает. Он же локальный. А мне надо его передать. – Melv Nov 21 '23 at 15:19
  • Вы очень поверхностно смотрите ответ, советую почитать внимательней, тогда поймете, что там прям в самом начале пример класса, в котором приведены все возможные способы объявления переменных, а также там есть А сможем ли мы получить доступ MyField из других классов, методов и др.?. Если не поняли, то ок, говорю в лоб - вынесите Player player за пределы метода. У вас такое кстати уже есть (OpenedChests например), как мог возникнуть подобный вопрос, если вы уже подобное делали, я не понимаю.... – EvgeniyZ Nov 21 '23 at 15:56
  • Я последний раз писал программы на шарпе лет 12 назад. Туго очень идёт. Почему-то до меня не доходило, что можно объявить поле в классе формы и работать с ним потом. Казалось почему-то, что обязательно надо в методе объявлять. Спасибо. – Melv Nov 21 '23 at 16:20
  • А если потом пользователь внутри программы захочет создать еще экземпляров класса, то как это можно реализовать будет? Я же не могу заранее знать сколько их будет. – Melv Nov 21 '23 at 16:27
  • 1
    Спроецируйте это на реальный мир. Вот скажем, вы сотрудник компании, у вас есть доска для заметок, на которую вы лично можете что-то написать. Чтоб другие могли написать туда что либо, вам что надо сделать? Правильно, пустить этого человека в свой офис, либо выставить доску в общедоступном месте. Вот также и тут. Что касается про "массовость" - что отвечает за хранение множества объектов? Наверно коллекции, массивы, и так далее, верно? Ну так, что мешает сделать коллекцию игроков, вынести за пределы метода, и добавлять туда по необходимости? – EvgeniyZ Nov 21 '23 at 16:34
  • Действительно, спасибо. Работает. List players = new List(); а потом можно добавить элементы в коллекцию players.Add(new Player(100, 0)); – Melv Nov 21 '23 at 16:43

0 Answers0