Xna 如果我两次投射一个项目会发生什么情况(例如,对于库存系统)?

Xna 如果我两次投射一个项目会发生什么情况(例如,对于库存系统)?,xna,c#,inventory,Xna,C#,Inventory,我正在用C#/XNA开发一个带有库存系统的游戏。我的计划是让库存存储基类Item。从项派生的是设备类(和其他类)。源于装备类的是枪类(和其他类)。物品有一个包含其类型(装备、工艺等)的枚举,装备类有一个包含其类型(枪、装甲等)的枚举。使用类型枚举中的信息——例如,将枪从库存中扔到世界上——从物品到设备,然后从设备到枪,是否有效?是 施法不会改变物体的性质,只是改变你“视其为”的东西。如果强制转换实际上不是该类型(或从该类型继承),则它将抛出一个InvalidCastException,因此在执行

我正在用C#/XNA开发一个带有库存系统的游戏。我的计划是让库存存储基类Item。从项派生的是设备类(和其他类)。源于装备类的是枪类(和其他类)。物品有一个包含其类型(装备、工艺等)的枚举,装备类有一个包含其类型(枪、装甲等)的枚举。使用类型枚举中的信息——例如,将枪从库存中扔到世界上——从物品到设备,然后从设备到枪,是否有效?

施法不会改变物体的性质,只是改变你“视其为”的东西。如果强制转换实际上不是该类型(或从该类型继承),则它将抛出一个
InvalidCastException
,因此在执行此操作时要小心

您可以改为使用
as
操作符,然后检查null,这是一种更安全的强制转换方法。无论哪种方式,你都可以随心所欲地施放,而且不会造成任何问题

要尝试并解释为什么从
物品
施放是可以的,请用纯英语来思考:

比如说我给你一堆东西。这些物品有很多种,其中一些是枪。你随意挑选一件物品(比如说是枪)。你可以安全地把它当作一件物品、一件装备或一把枪不管是哪一个,只要它实际上是一把枪。当然,如果你摘了一个苹果,并试图把它当作一把枪,那可能会引起一些问题(和欢笑:)


我相信问题是:

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;

这两种说法有些不同。请参见

刚从
物品
投射到
,只要物品是枪,它就可以正常工作。或者更好的是,依赖多态性。确定。什么让你认为它不会,为什么不试试呢?你应该像@Ben所说的那样依赖多态性。让基类包含指定其类型的枚举在现代编程中是非常落后的。我想我需要做一些学习。谢谢你的回答。有人建议直接从一件物品到另一把枪。这行得通吗?请参阅我的编辑,了解为什么这是完全可以接受的。让我知道它是否仍然令人困惑,这是OOP中一个非常重要的概念。啊,我明白了。再次感谢!