向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");
您之所以看到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
显示为零。