【问题标题】:What happens if I cast an item twice (e.g. for an inventory system)?如果我两次施放一个物品(例如对于库存系统)会发生什么?
【发布时间】:2014-04-30 23:40:18
【问题描述】:

我正在用 C#/XNA 开发一个带有库存系统的游戏。我的计划是让库存存储基类 Item。派生自 Item 的是 Equipment 类(和其他类)。派生自 Equipment 类的是 Gun 类(和其他类)。 Item 有一个包含其类型(装备、工艺等)的枚举,而 Equipment 类有一个包含其类型(枪、盔甲等)的枚举。使用来自类型枚举的信息时——例如从物品栏中将一把枪扔到世界上——从物品投射到装备,然后从装备投射到枪,它会起作用吗?

【问题讨论】:

  • 只需从Item 转换为Gun,只要项目 枪,就可以正常工作。
  • 或者更好的是,只依赖多态性。
  • 当然。是什么让您认为它不会,为什么不尝试一下?
  • 正如@Ben 所说,您应该依赖多态性。让基类包含一个指定其类型的枚举在现代编程中确实是倒退。
  • 我想我有一些学习要做。

标签: xna c# inventory


【解决方案1】:

是的

铸造不会改变对象的性质,只会改变您“看待它的方式”。如果它实际上不是该类型(或继承自该类型),则强制转换将抛出 InvalidCastException,因此在执行此操作时要小心。

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

要尝试解释为什么从Item 转换为Gun 是可以的,请用纯英语的方式思考:

假设我递给你一堆物品。这些物品有很多种,其中一些是枪。您随机选择一个项目(为了争论而说它是一把枪)。您可以安全地将其视为物品、设备或枪支。 哪个都无所谓,只要是枪就行了。当然,如果你摘了一个苹果,并试图把它当作一把枪,那可能会导致一些问题(和欢闹:))。

【讨论】:

  • 感谢您的回答。有人建议直接从Item转换为Gun。这行得通吗?
  • 查看我的编辑以了解为什么这是完全可以接受的。让我知道它是否仍然令人困惑,这是 OOP 中一个非常重要的概念。
  • 啊,我明白了。再次感谢!
【解决方案2】:

我相信问题是这样的:

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?

【讨论】:

    猜你喜欢
    • 2010-12-02
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 2016-07-11
    • 2013-10-26
    • 1970-01-01
    相关资源
    最近更新 更多