向ListBox添加成本

本文关键字:添加 ListBox | 更新日期: 2023-09-27 18:30:10

我目前有一个列表框,显示日期、蛋糕类型和大小。我想在列表框中添加成本,但是我遇到了麻烦。它当前显示的成本为零。成本显示在标签中(lblRoundCost)。我有一个名为Cake的基类和两个子类RoundCake和SquareCake。我不确定这个代码对于基类是否正确

class Cake
{
    private const int CostOfFoodPerPerson = 25;
    public int size;
    private bool chocolateIcing; 
    protected DateTime cakeDate;
    decimal cost;
public Cake(int numberOfPeople, bool chocolateIcing, DateTime cakeDate)
{
    this.chocolateIcing = chocolateIcing;   
    Size = size;    
    this.cakeDate = cakeDate;
    Cost = cost;
}
public virtual decimal Cost
{
    get { return cost; }
    set { cost = value; }
}
public virtual int Size
{
    get { return size; } 
    set { size = value; }
}
public virtual bool ChocolateIcing
{
    set { chocolateIcing = value; }
}
public virtual decimal CalculateCost()
{
    decimal CostOfIcing = 0; 
    if (chocolateIcing)
    CostOfIcing = (Size * 1.5M) + 10M;
else
    CostOfIcing = 0; 
    decimal TotalCost = CostOfIcing + CostOfFoodPerPerson;
    return TotalCost;
}
public DateTime CakeDate
{
    set { cakeDate = value; }
}
}
}

圆形蛋糕代码

class RoundCake : Cake
{
bool fruitOption;
public RoundCake(int size, bool fruitOption, bool chocolateIcing, DateTime cakeDate)
: base(size, chocolateIcing, cakeDate)
{FruitOption = fruitOption;}
public bool FruitOption
{ 
    set { fruitOption = value; }
}

public override decimal CalculateCost()
{
decimal totalCost;
if (fruitOption)
{
totalCost = base.CalculateCost(); 
return totalCost + (totalCost * .05M);
}
else 
{
totalCost = base.CalculateCost() ; 
return totalCost;
}
}
public override string ToString()
{
    return String.Format("{0,-20}{1,2}{2,20}{2,20}", cakeDate.ToShortDateString(), "RC",Size,Cost);
}

Form1代码

private void btnRound_Click_1(object sender, EventArgs e)
{
    lstCake.Items.Add(roundCake);
}
roundCake = new RoundCake((int)nudRound.Value, chbFruit.Checked, chbChocoRound.Checked,
dtpRound.Value.Date);
lblRoundCost.Text = roundCake.CalculateCost().ToString("c");

向ListBox添加成本

您之所以看到0,是因为您从未实际向Cost分配任何内容,而decimal的默认值为0。

发生了什么:

在你的基础构造函数中,你有:

Cost = cost;

然而,cost从未在类中初始化,也没有通过构造函数传入。所以在基地是0。

继承类也会发生同样的情况——从来没有指定Cost,所以它仍然是0(即使没有基类,它也仍然是0)。

现在,在这行代码中:

lblRoundCost.Text = roundCake.CalculateCost().ToString("c");

您将由CalculateCost()计算的值分配给Label,但从未在类中持久化该值:

public override decimal CalculateCost()
{
    decimal totalCost;
    if (fruitOption)
    {
        totalCost = base.CalculateCost(); 
        return totalCost + (totalCost * .05M);
    }
    else 
    {
        totalCost = base.CalculateCost() ; 
        return totalCost;
    }
}

返回一个值,但不将其分配给类成员cost。基本实现也做同样的事情。

有很多方法可以解决这个问题。这里有一个(这是一个非常简单的例子,老实说,它对我来说有点代码味,但它将作为一个例子提供服务器):

修改CalculateCost()方法以更新cost字段:

public virtual void CalculateCost()
{
    decimal CostOfIcing = 0; 
    if (chocolateIcing)
        CostOfIcing = (Size * 1.5M) + 10M;
    else
        CostOfIcing = 0; 
    decimal cost = CostOfIcing + CostOfFoodPerPerson;
}

请注意,这不再返回类型(你可能仍然会返回类型,这在很大程度上取决于你的整体设计,所以选择最适合你的设计的路径)。不要忘记在继承类的实现中也进行此更改。

现在,您只需要调用CalculateCost()方法,就可以获得可用的成本,并且可以使用该属性来获取分配给Labels或其他所需的成本,它将显示在您重写的ToString()方法中。

同样,有多种方法可以解决这个问题,它们取决于OOP原则和您的设计需求的组合。我给出这个答案的主要意图是证明为什么cost显示为零。