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

本文关键字:派生 基类 存储 单个 列表 | 更新日期: 2023-09-27 18:30:40

我正在做一个基础 uni C# 作业,可以使用一点帮助。我们正在制作比萨饼应用程序,并且需要将披萨酱(3种)作为派生自IngredientSauce类。所以我有一个类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存储在同一列表中的最佳方法是什么,以便我使用单个方法调用循环访问列表,并且它将酌情使用基类或派生类的方法?

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

您已经复制了派生类中的字段和属性,因此您有如下所示的内容:

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.

以下是您想要的方法的简短示例:

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();
        }
    }
}

输出:

成分