1

请在我player的游戏类中查看此方法:

public void eatSomethingt(Items eatable)
{
    foreach (Items i in items)
    {
        if (i is Ieatable && i.name == eatable.name) //Give items an ID in the future
        {
            Ieatable k = i as Ieatable;
            k.eat(this);
            items.Remove(i);
            break;
        }
    }
}

基本上,这将遍历玩家拥有的物品列表并比较它们以检查传入的参数是否可食用,如果是,则检查玩家是否有。如果它进入 IF 语句,则该项目将从玩家背包中移除(items

问题出在这行:k.eat(this)它被发送到这个方法:

public void eat(Player p)
{
    Console.WriteLine(p.Name + " Ate the " + name);
    p.life = p.life + amountHealed;
}

这感觉有点像“乒乓球”,因为它是Fruit向玩家提供物品的类。由于我的Fruit类实现了接口iEatable (这肯定是有意义的),我必须eat在实现它的类中放置一个方法。

4

2 回答 2

1

我觉得应该是玩家的一种方法:

更正确的IEatable应该是IEdible甚至IConsumable

public class Player
{
    .
    .
    public string Name {get;set;}
    public int Life {get;set;}
    .
    .
    public void eat(IEdible food)
    {
        Console.WriteLine(Name + " Ate the " + food.name);
        life += food.amountHealed;
    }
}
于 2013-09-15T20:30:52.113 回答
1

争取看起来像自然语言的代码。例如,告诉Consoleto确实有意义Write(a)Line。告诉食物吃是没有意义的。食物本身应该被吃掉。此外,食物很少有动画——它不会与环境发生任何互动,因此问问自己它是否真的应该有任何方法?我现在唯一想出的可能是一种Rot方法,但这也可以在导致食物腐烂的细菌类中实现。解决此任务的最 OOP 方式似乎是:

  1. 食物应该是一个没有方法的结构
  2. 将所有工作委托给玩家

其次,为什么要传递一个Items实例而不是一个IEdible? 相反,像这样定义方法:

public void eatSomething(IEnumerable<IEdible> eatable)

这样一来,任何试图传递不能被吃掉的东西的尝试都会在编译时被捕获。它还删除了if语句的第一个条件。

第三,使用 LINQ 来缩短您的代码。

于 2013-09-15T20:48:48.667 回答