将基类和派生类存储在单个列表中

时间:2016-01-15 09:55:58

标签: c# oop polymorphism

我正在做一个基础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或派生类的方法?

2 个答案:

答案 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>