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

基本上,我是第一次使用Dictionary,并且尝试访问方法MedMatePack(),该方法位于我的MedPack类中,该类是Item的子级,将其添加到Dictionary中时会创建该方法。问题是它说:

****编辑****我觉得我应该在第一轮中添加Item类(现在添加到底部)。遵循一些很棒的建议,我使用((MedPack)inventory [“ MedPack”])。useMedPack();进行了投射。现在可以正常使用了!尽管一些反馈意见很好,但我从每个人的建议中学到了很多东西! :)


  “项目”不包含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;

    }

}


}

最佳答案

您的词典存储了Item类型的对象。无法保证任意Item将是MedPack,因此您不能直接在其上调用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
}

09-18 17:53