1

我对我是否正确接近这个问题感到有些困惑。假设我有一个滚动游戏,玩家可以在其中击败怪物并收集物品,这是我的一些玩家类:(c#)

    public string Name { get; set; }
    public double life { get; set; }
    public double power { get; set; }
    public Swords weapon { get; set; } // their Held weapon
    private List<Items> items; //Represents their backpack
    private Monster monster; //The monster they are currently facing.

    public Player(string name)
    {
        this.Name = name;
        life = 1000;
        power = 10;
        weapon = new Swords("Fists", 100, 1); //The power of the weapon. Can only punch at the start
        items = new List<Items>();
    }

    public void addItem(Items i)
    {
        items.Add(i);
    }

然后看看我的播放器类中的这个方法:

public void equiptSword() //
    {
        Swords tempSword;
        foreach (Items i in items)
        { 
            if (i is Swords)
            {
                tempSword = i as Swords;
                tempSword.equiptItem(this); 
            }
        }
    }

如您所见,我有一个名为 items 的超/基类,一切都源自于此。当玩家击败怪物时,他们会获得一把剑,我将其添加到物品列表(他们的背包)中。基类没有虚方法equiptItem(),只有剑有这个方法。因此,我不能只输入 type items[5].equiptItem()。这意味着我必须使用 if 语句来检查 i 是否是剑,如果是,则将其作为剑施放,然后装备它。但是有一些关于这个的东西让我觉得我不正确地接近它,当然,我可以向基类 Items 添加一个虚拟方法,但是我不希望所有项目都具有可装备性的选项。

对不起,如果我在胡说八道。

你怎么看,我正确地接近这个吗?

4

1 回答 1

1

我认为你在正确的轨道上。

我同意您不想将一大堆不相关的东西添加到Item.

我认为您可以提出一些广泛的接口来简化代码。

例如,您可以有一个具有方法的IEquippable接口Equip()。然后任何可装备的项目都会实施IEquippable

您可以有其他接口以类似的方式表示其他事物,例如IConsumableIPortable

然后在您的代码中,您可以执行以下操作:

IEquippable equippable = item as IEquippable;

if (equippable != null)
    equippable.Equip(); /// Etc

使用 Linq,您可以编写如下内容:

foreach (var equippableItem in inventoryItems.OfType<IEquippable>())
{
    equippableItem.Equip();
}

但是,您应该尽可能保留强类型集合——当然,库存就其本质而言是一个异构集合。

另请注意,使用接口来表示这些概念允许您拥有实现多个它们的项目,例如药水是IConsumableIPortable

将执行此操作的逻辑放入单独的类中将其全部隐藏起来可能是个好主意;例如,一个Equipper处理装备的类。

不过有一件事——我不明白为什么你必须通过穿过袋子来装备剑。我原以为你会有一组Loot由怪物掉落的物品(让我们称之为),你会像这样处理:

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.
}
于 2013-05-25T16:29:14.133 回答