C#继承多态项目中Eat()方法实现及调用问题求助
解决方案:实现Animal.Eat()方法与Petowner.Feed()参数传递
1. 实现Animal类的Eat()方法
按照需求完成进食逻辑,对比传入食物与动物偏好食物,更新饥饿状态:
public virtual void Eat(string food) { // 严格匹配食物(若需忽略大小写可改为food.Equals(favFood, StringComparison.OrdinalIgnoreCase)) if (food == favFood) { hungry = false; Console.WriteLine($"{name} äter {food} och är nu mätt!"); } else { hungry = true; HungryAnimal(); Console.WriteLine($"{name} vill inte äta {food}!"); } }
同时优化ToString()方法,返回动物的实际信息(默认base.ToString()仅返回类型名):
public override string ToString() { return $"Namn: {name}, Ålder: {age}, Ras: {breed}, Favoritmat: {favFood}"; }
2. 修改Petowner类的Feed()方法,获取并传递食物参数
在用户选择动物后,添加食物输入步骤,将参数传入Eat()方法,同时完善输入合法性校验:
public void Feed() // Sub-menu { int x = 0; Console.Clear(); Console.WriteLine("Vilket djur vill du mata?\n---------------------\n"); PrintAnimals(); try { x = int.Parse(Console.ReadLine()); // 校验动物序号是否在有效范围内 if (x < 1 || x > pets.Count) { Console.Clear(); Console.WriteLine("Ogiltigt nummer, prova igen!\n--------------------\nTryck på valfri tangent för att gå tillbaka...\n"); Console.ReadKey(); Feed(); // 重新进入投喂菜单 return; } } catch (Exception) { Console.Clear(); Console.WriteLine("Nu vart det fel, prova igen! (Välj med siffror)\n--------------------\nTryck på valfri tangent för att gå tillbaka...\n"); Console.ReadKey(); Feed(); // 重新进入投喂菜单 return; } // 获取要投喂的食物 Console.Clear(); Console.WriteLine($"Vilken mat vill du ge {pets[x-1].name}?"); string food = Console.ReadLine(); // 调用Eat方法并传入食物参数 pets[x-1].Eat(food); Console.WriteLine("\nTryck på valfri tangent för att gå tillbaka till menyn..."); Console.ReadKey(); }
注:假设PrintAnimals()方法按1-4的顺序输出动物列表,因此用x-1对应列表索引。
额外补充
如果需要HungryAnimal()有具体行为,可在Animal类或子类中重写该方法,示例:
public virtual void HungryAnimal() { Console.WriteLine($"{name} är fortfarande hungrig!"); }
内容的提问来源于stack exchange,提问作者pickleriick137
相关产品推荐
相关产品推荐

