向ListBox添加成本

时间:2014-11-13 06:18:01

标签: c# class listbox

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

1 个答案:

答案 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显示为零。