请在我的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
方法。
答案 0 :(得分: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;
}
}
答案 1 :(得分:1)
看起来像自然语言的代码的冲突。例如,告诉Console
到Write(a)Line
是有意义的。告诉食物吃是没有意义的。食物本身应该吃。此外,食物很少动画 - 它不会开始与环境的任何互动,因此问自己是否真的应该有任何方法?我现在唯一想到的可能是Rot
方法,但也可以在导致食物腐烂的细菌类中实施。解决此任务的最多OOP方式似乎是:
其次,为什么要传递Items
实例而不是IEdible
?相反,定义方法:
public void eatSomething(IEnumerable<IEdible> eatable)
这样,任何传递无法吃掉的东西的尝试都会在编译时捕获。它还删除了if
语句的第一个条件。
第三,使用LINQ来缩短你的代码。