我目前有一个列表框,显示日期,蛋糕类型和大小。我想为列表框添加成本,但我遇到了麻烦。它目前显示零成本。成本显示在标签(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; }
}
}
}
RoundCake代码
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 :(得分:0)
您看到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
显示为零。