在单个列表中存储基类和派生类
本文关键字:派生 基类 存储 单个 列表 | 更新日期: 2023-09-27 18:30:40
我正在做一个基础 uni C# 作业,可以使用一点帮助。我们正在制作比萨饼应用程序,并且需要将披萨酱(3种)作为派生自Ingredient
的Sauce
类。所以我有一个类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();
}
}
}
输出:
成分
酱