C# 何时使用as来投射对象?
我对我是否正确处理这个问题有点困惑。假设我有一个掷骰游戏,玩家可以打败怪物并收集物品,下面是我的一些玩家职业:(c#) 正如您所看到的,我有一个名为items的超级/基类,所有东西都是从这个类派生的。当一个玩家击败一个怪物时,他们会得到一把剑,我会把它添加到物品列表(他们的背包)中。基类没有C# 何时使用as来投射对象?,c#,object,polymorphism,C#,Object,Polymorphism,我对我是否正确处理这个问题有点困惑。假设我有一个掷骰游戏,玩家可以打败怪物并收集物品,下面是我的一些玩家职业:(c#) 正如您所看到的,我有一个名为items的超级/基类,所有东西都是从这个类派生的。当一个玩家击败一个怪物时,他们会得到一把剑,我会把它添加到物品列表(他们的背包)中。基类没有equititem()的虚拟方法,只有刀剑有这个方法。因此,我不能只键入typeitems[5].equititem()。这意味着我必须使用一个if语句来检查我是否是一把剑,如果是,把它当作一把剑来扔,然后装
equititem()
的虚拟方法,只有刀剑有这个方法。因此,我不能只键入typeitems[5].equititem()
。这意味着我必须使用一个if语句来检查我是否是一把剑,如果是,把它当作一把剑来扔,然后装备它。但是有一点让我觉得我做得不对,当然,我可以在基类项中添加一个虚拟方法,但我不希望所有项都有可装备的选项
对不起,如果我漫无边际的话
你认为呢,我的做法正确吗?我认为你的思路是对的 我同意你不想在
项目
中添加一大堆不相关的东西
我认为您可以提出一些宽泛的接口来简化代码
例如,您可以有一个IEquippable
接口,它有一个Equip()
方法。然后,任何装备项目都将实现IEquippable
您可以使用其他接口以类似的方式表示其他内容,例如IConsumable
和IPortable
然后在您的代码中,您可以执行以下操作:
IEquippable equippable = item as IEquippable;
if (equippable != null)
equippable.Equip(); /// Etc
使用Linq,您可以编写以下内容:
foreach (var equippableItem in inventoryItems.OfType<IEquippable>())
{
equippableItem.Equip();
}
我认为你在正确的轨道上 我同意你不想在
项目
中添加一大堆不相关的东西
我认为您可以提出一些宽泛的接口来简化代码
例如,您可以有一个IEquippable
接口,它有一个Equip()
方法。然后,任何装备项目都将实现IEquippable
您可以使用其他接口以类似的方式表示其他内容,例如IConsumable
和IPortable
然后在您的代码中,您可以执行以下操作:
IEquippable equippable = item as IEquippable;
if (equippable != null)
equippable.Equip(); /// Etc
使用Linq,您可以编写以下内容:
foreach (var equippableItem in inventoryItems.OfType<IEquippable>())
{
equippableItem.Equip();
}
谢谢你的帮助。我可以看到一个界面将如何使这更易于管理。谢谢你的帮助。我可以看到一个界面将如何使它更易于管理。
void handleLoot(Loot loot)
{
// Get first sword dropped, or null if none.
var sword = Loot.Items.OfType<Sword>().FirstOrDefault();
if (sword != null) // Sword implements IEquippable so we can:
sword.Equip(); // just equip it.
}