为了显着简化问题,您可以创建一个基类“项目”,您的所有项目类型都来自:
public class Item
{
// put any common attributes here
}
public class Armor : Item
{
// define properties for Armor here
}
public class Weapon : Item
{
// define properties for weapons here
}
当您像这样创建子类时,您可以使用Item
变量来存储任何派生类。您可以创建一个新Weapon
实例并将其分配给Item
实例类型的库存槽。所以你的Inventory
类变成了Item
s 的集合。
假设您想要数组到库存位置的 1 对 1 映射,并且不希望自己重新排列东西,那么数组方法可能是要走的路。
class Inventory
{
// Array to store items
public Item[] Items { get; private set; }
// Inventory capacity is array length
public int Capacity { get { return (Items == null) ? 0 : Items.Length; } }
// Constructor
public Inventory(int capacity = 10)
{
SetInventorySize(capacity);
}
// Set size of inventory, retaining contents where possible
public void SetInventorySize(int cap)
{
if (cap <= 0)
Items = null;
else if (Items == null)
Items = new int[cap];
else
Array.Resize(ref Items, cap);
}
// Get index number of first free slot in inventory
public int FirstAvail()
{
if (Items != null)
{
for (int i = 0; i < Items.Length; ++i)
{
if (Items[i] == null)
return i;
}
}
return -1;
}
// Add item to array, returning index or -1 on failure
public int AddItem(Item item)
{
if (Items != null)
{
for (int i = 0; i < Items.Length; ++i)
{
if (Items[i] == null)
{
Items[i] = item;
return i;
}
}
}
return -1;
}
}
该Items
属性是一个数组,您可以存储任何Item
衍生对象,如Armor
或Weapon
以上。要将项目添加到列表中,请找到一个清晰的位置(FirstAvail
例如使用方法)并将项目放入该位置的项目列表中。
当您使用库存中的物品时,您需要确定它们是什么来弄清楚如何处理它们。您可以as
这样使用操作:
// get the first item in the inventory
Item item = inventory.Items[0];
if ((Armor armorItem = item as Armor) != null)
{
// Code to execute for Armor items
armorItem.Wear();
}
else if ((Weapon weaponItem = item as Weapon) != null)
{
// Code to execute for Weapon items
weaponItem.Equip();
}
else if ((Potion potionItem = item as Potion) != null)
{
// Code to execute for Potion items
potionItem.Drink();
}
该as
操作将检查对象的真实类型,如果不匹配则返回 null。因此,如果您将物品存储Potion
在库存的插槽 0 中,它不会尝试将其用作Armor
或Weapon
物品。
当然,这是一个人为的例子。Item
在类中定义基本的通用操作并在子类中覆盖它们会更有用。然后,您只需调用(例如)item.DefaultAction()
并DefaultAction
为每个子类型实现覆盖以执行适当的操作。