通过Dictionary访问子对象的方法

时间:2015-10-08 19:40:09

标签: c#

新程序员,使用C#和VB 2015,第一次发布所以请温柔!

基本上我是第一次使用Dictionary,我正在尝试访问我的MedPack类中的方法useMedPack(),它是Item的子项,在将它添加到我的Dictionary时创建。问题是它说:

****编辑****我觉得我应该在第一轮添加Item类(现在添加到底部)。根据一些很棒的建议,我使用((MedPack)库存[“MedPack”])。使用MedPack();它现在按预期工作!虽然一些反馈非常好,但我从每个人的建议中学到了很多东西! :)

  

'Item'不包含useMedPack();。

的定义
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<String, Item> inventory = new Dictionary<String, Item>();

            inventory.Add("MedPack", new MedPack("MedPack", 1));

            MedPack.pickUpMedPack(inventory);

            //THIS IS THE PROBLEM inventory["MedPack"].useMedPack();

            Console.WriteLine("Press any key to exit");
            Console.ReadKey();

        }
    }
}

namespace ConsoleApplication1
{
    class MedPack : Item
    {

        private int healthReturn = 10;

        public MedPack() : base()
        {

        }

        public MedPack(String itemName, int itemQuantity) : base(itemName, itemQuantity)
        {

        }

        public void useMedPack() 
        {
            decreaseQuantity(1);
        }

        public static void pickUpMedPack(Dictionary<String, Item> inventory)
        {

            if (!inventory.ContainsKey("MedPack"))
            {

                inventory.Add("MedPack", new MedPack("MedPack", 1));

                Console.WriteLine("You found a MedPack! It was added to the inventory");


            }
            else
            {

                inventory["MedPack"].increaseQuantity(1);

                Console.WriteLine("You found ANOTHER MedPack! It was added to the inventory");

            }
        }
    }
}

命名空间ConsoleApplication1 {     类项目     {

    private String itemName;
    private int itemQuantity;


    public Item(String itemName, int itemQuantity)
    {

        this.itemName = itemName;
        this.itemQuantity = itemQuantity;

    }

    public Item()
    {

    }

    public void increaseQuantity(int increaseQuantity)
    {

        this.itemQuantity += increaseQuantity;

    }

    public void decreaseQuantity(int increaseQuantity)
    {

        this.itemQuantity -= increaseQuantity;

    }


    public String getName()
    {

        return this.itemName;
    }

    public void setName(String name)
    {

        this.itemName = name;

    }

    public int getQuantity()
    {

        return this.itemQuantity;
    }

    public void setQuantity(int x)
    {

        this.itemQuantity = x;

    }

}

}

1 个答案:

答案 0 :(得分:4)

您的词典存储Item类型的对象。我无法保证任意ItemMedPack,因此您无法直接在其上调用useMedPack

如果,在您的情况下,您知道该项目是MedPack,您可以投出它:

((MedPack)inventory["MedPack"]).useMedPack();

或两行:

MedPack mp = (MedPack)inventory["MedPack"];
mp.useMedPack();

如果在运行时,该项目 MedPack,您将获得例外。

如果您想要一个可以应用于所有项类型的方法,那么在Item中定义它并根据需要在子类中覆盖它:

Item中的

public virtual void UseItem()
{
    // base implementtaion
}
MedPack中的

public override void UseItem()
{
    // implementation specific to MedPack
}