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