如果我投两次物品会发生什么情况(例如库存系统)?

时间:2014-04-30 23:40:18

标签: xna c# inventory

我正在使用C#/ XNA中的库存系统开发游戏。我的计划是库存来存储基类Item。派生自Item是一个装备类(和其他类)。派生类是一个Gun类(以及其他类)。 Item具有包含其类型(设备,制作等)的枚举,而Equipment类具有包含其类型(枪,盔甲等)的枚举。使用类型枚举中的信息可以在将枪从库存中放入世界时 - 从物品转换为设备,然后从设备转换为枪?

2 个答案:

答案 0 :(得分:3)

施放并不会改变对象的性质,只是改变你所看到的状态"将其视为"。如果它不是那种类型(或从该类型继承),则会抛出InvalidCastException,因此在执行此操作时要小心。

您可以改为使用as运算符并在之后检查null是一种更安全的转换方式。无论哪种方式,你都可以随心所欲地施展,但不会造成任何问题。

尝试解释为什么从Item转换为Gun是正常的,请用纯英文术语来思考:

  

说我递给你一堆物品。这些物品有很多种类,其中一些是枪支。你随机选择一个项目(为了论证,说它是一个枪)。您可以安全地将其视为物品,设备或枪支。 只要它实际上是一把枪并不重要。当然,如果你选了一个苹果,并试图把它当成枪,这可能会导致一些问题(和欢闹:))。

答案 1 :(得分:0)

我相信问题是:

var someItem = new Gun() { ItemType = ItemTypes.Equipment, EquipmentType = EquipmentTypes.Gun };

//Later, after item is dropped, we know it is an Item only, do some fancy dynamic cast?
Item droppedItem = Drop(someItem);
var castItem = ((droppedItem.EquipmentType)(droppedItem.ItemType)droppedItem) //Can't do this

不幸的是,在C#中无法在运行时进行动态转换。

您需要以下内容:

if(droppedItem is Gun)
{
    DoSomethingWithAGun(droppedItem);
}

正如其他人所提到的,如果你已经知道它是一个枪,那么就这样做:

Gun droppedGun = (Gun)droppedItem;
//Or
Gun droppedGun = droppedItem as Gun;

这两个陈述之间存在一些差异。见Direct casting vs 'as' operator?