新程序员,第一次使用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
}