Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 何时使用as来投射对象?_C#_Object_Polymorphism - Fatal编程技术网

C# 何时使用as来投射对象?

C# 何时使用as来投射对象?,c#,object,polymorphism,C#,Object,Polymorphism,我对我是否正确处理这个问题有点困惑。假设我有一个掷骰游戏,玩家可以打败怪物并收集物品,下面是我的一些玩家职业:(c#) 正如您所看到的,我有一个名为items的超级/基类,所有东西都是从这个类派生的。当一个玩家击败一个怪物时,他们会得到一把剑,我会把它添加到物品列表(他们的背包)中。基类没有equititem()的虚拟方法,只有刀剑有这个方法。因此,我不能只键入typeitems[5].equititem()。这意味着我必须使用一个if语句来检查我是否是一把剑,如果是,把它当作一把剑来扔,然后装

我对我是否正确处理这个问题有点困惑。假设我有一个掷骰游戏,玩家可以打败怪物并收集物品,下面是我的一些玩家职业:(c#)

正如您所看到的,我有一个名为items的超级/基类,所有东西都是从这个类派生的。当一个玩家击败一个怪物时,他们会得到一把剑,我会把它添加到物品列表(他们的背包)中。基类没有
equititem()
的虚拟方法,只有刀剑有这个方法。因此,我不能只键入type
items[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.
}