Как вызвать некоторый код, когда класс был вставлен в список - PullRequest
1 голос
/ 07 апреля 2020

У меня есть этот класс Item:

 public class Item
    {
        public string Name;
        public Entity ItemOwner;
        public Action<Entity> effect;        

        public Item(string name, Action<Entity> effect)
        {
            Name = name;
            this.effect = effect;
        }

        public void Use()
        {
            effect(ItemOwner);
        }
    }

и этот класс Entity:

public class Entity
    {
        public string Name;
        public float Health;
        public List<Item> Items = new List<Item>();
        public bool CanDie;
        public bool Dead;

        public Entity(string name, float health, bool canDie)
        {
            Name = name;
            Health = health;            
            CanDie = canDie;
        }

        public void UseItem(string name)
        {
            foreach (var item in Items)
            {
                if (item.Name == name)
                {
                    item.Use();
                    Items.Remove(item);
                    break;
                }
            }
        }
     }

Я хочу знать, возможно ли установить EntityOwner для данного объекта, когда это предмет помещен в инвентарь сущности.

что я могу сделать в данный момент, это «Основная программа»:

     Entity Player = new Entity("Dave", 50, true);            
     Item Potion = new Item("Healing Potion", ItemOwner => ItemOwner.Health += 25);
     Potion.ItemOwner = Player;
     Player.Items.Add(Potion);
     Player.UseItem("Healing Potion");

Я хочу этот конкретный c фрагмент кода:

Potion.ItemOwner = Player;

Срабатывать, когда предмет помещается в инвентарь сущности.

Возможно ли это как-нибудь?

1 Ответ

2 голосов
/ 07 апреля 2020

Я не думаю, что этого можно было бы достичь изнутри класса элементов очень чисто.
Что вы можете сделать, это добавить функцию к классу Entity примерно так:

public void AddItem(Item item) {

    Items.Add(item);
    item.EntityOwner = this;

}

Точно так же вы хотели бы функцию RemoveItem, которая отменяет EntityOwner.

Если вы сделаете этот метод, вы, вероятно, захотите, чтобы Items была переменной protected, чтобы никакой другой класс не мог добавить элемент в список без функции AddItem.

Другой вариант - добавить функцию OnAddedToList в класс Item, а вместо item.EntityOwner выше просто вызвать функцию добавления в список для этого элемента. Может быть, что вы хотите, если у каждого предмета есть больше уникальных вещей, чем просто установить владельца.

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