我正在做一个基础uni C#任务,可以使用一些帮助。我们正在制作披萨应用程序,并且需要将披萨酱(3种)作为Sauce
类派生自Ingredient
。所以我有一个班级Ingredient
和一个派生班级Sauce
。
我将成分存储在一个列表中,然后通过迭代来提取成分和诸如此类的成本。当然,Sauce
对象具有相同名称的方法,以不同的方式执行操作(覆盖?)我的麻烦是Sauce
对象没有返回正确的值。
我在初始化列表后立即设置了一个断点。正如您在此处所见:http://i.imgur.com/BgwKeWL.png由于某种原因,似乎信息在列表中被加倍。这是将数据加载到列表中的代码:
ingredients.Add(new Ingredient("Mushrooms", 0.75, 80, "handfuls"));
ingredients.Add(new Sauce("Tomato Sauce", "cups"));
大概后面的方法返回无效值,因为它们返回了它找到的每个值的第一个。
这让我想到...将Ingredient
和派生的Sauce
存储在同一个列表中的最佳方式是什么,这样我就可以使用单个方法调用遍历列表,它将会根据需要使用base或派生类的方法?
答案 0 :(得分:3)
您已复制派生类中的字段和属性,因此您可以这样:
class Ingredient {
Ingredient(decimal cost) { Cost = cost; }
public double Cost { get; set; }
}
class Sauce : Ingredient {
Sauce(decimal cost) { Cost = cost; }
// This hides Ingredient.Cost.
// You probably don't want that.
public double Cost { get; set; }
}
Sauce
的构造函数设置了Sauce.Cost
,但是当通过List<Ingredient>
访问时,Ingredient.Cost
被访问。
删除派生类中的重复字段。
哦,并使用decimal
来赚钱,而不是double
。
答案 1 :(得分:0)
以下是您的方法所需的简短示例:
class Ingredient
{
public int Nom;
public virtual void TellName()
{
Console.WriteLine("Ingredient");
}
}
class Sauce : Ingredient
{
public override void TellName()
{
Console.WriteLine("Sauce");
}
}
class Program
{
static void Main(string[] args)
{
var ingredientList = new List<Ingredient> {new Ingredient(), new Sauce()};
foreach (var ingredient in ingredientList)
{
ingredient.TellName();
}
}
}
输出:
成分</ P>
酱