新程序员,使用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;
}
}
}
答案 0 :(得分:4)
您的词典存储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
}