2012-03-05 51 views
3

我有一个重写ToString()方法,我要输出格式化的数据。这些数据由11个不同的项目组成。除了一个项目外,我可以正确显示所有项目,但该项目仅显示为0.不知何故,它未达到ToString()方法。我调试的程序和随后线,数据线,并在该点右侧要去ToString()方法之前就消失了,我不知道为什么。这是我的代码。我只发布我认为与传递数据有关的代码。如果我错了,需要所有代码,请告诉我。数据未到达重写ToString()方法

private void btnPaymentButton_Click(object sender, EventArgs e) 
    {    
     amountPaid = double.Parse(this.txtAmountPaid.Text); 

     orderPaymentObject = new Payment(orderObject.TotalAmountDue, amountPaid);    

     this.txtNumberOfPizzaOrdered.Clear(); 
     this.txtNumberOfCokesOrdered.Clear(); 
     this.txtAmountDue.Clear(); 
     this.txtAmountPaid.Clear(); 

     this.lblYourOrder.Visible = true; 
     this.rtxtYourOrder.Visible = true; 

     this.rtxtYourOrder.Text = orderObject.ToString();    
    }  

....... 

public class Payment 
{ 
    PizzaOrder orderObject; 
    double amountPaid = 0.0, 
      totalAmountDue = 0.0;   

    public Payment() 
    { 
    } 

    public Payment(double amountDue, double payment) 
    { 
     orderObject = new PizzaOrder(); 
     amountPaid = payment; 
     totalAmountDue = amountDue; 
     orderObject.GetChangeDue(totalAmountDue, amountPaid); 
     //orderObject.ToString();    
    } 

    public Payment(double payment) 
    { 
     amountPaid = payment; 
    } 

    public double AmountPaid 
    { 
     get 
     { 
      return this.amountPaid; 
     } 
    } 
} 

...... 

public override string ToString() 
    { 
     Payment paymentOrder = new Payment(); 

     return string.Format(" {0} Pizzas @ {1:C}: {2,8:C}\n" + 
      " {3} Cokes @ {4:C}: {5,8:C}\n" + 
      "  Order Amount: {6,8:C}\n" + 
      "    Sales Tax: {7,9:C}\n" + 
      "   Amount Due: {8,8:C}\n" + 
      "   Amount Paid: {9,9:C}\n\n" + 
      "    Change Due: {10,9:C}", NumberOfPizzas, 
      PIZZA_PRICE, totalCostOfPizza, NumberOfCokes, COKE_PRICE, 
      totalCostOfCoke, FoodAndDrinkTotal, TotalSalesTax, 
      TotalAmountDue, paymentOrder.AmountPaid, GetChangeDue(totalAmountDue,amountPaid)); 
    }   

没有正在传递的值是amountPaid(第二从最后一个)。

我试着:

  • 传递amountPaid变量在OrderFrom类由内外的ToString()方法,
  • 通过实例化传递amountPaid变量在Payment类实例化对象OrderForm一个Payment对象内部和ToString方法之外,并且
  • 主叫输入amountPaid VA可以在toString方法中作为变量和属性使用riable。

说实话,我抓住了许多吸管,我现在完全困惑,不知道该怎么做。

+3

你为什么期望它是?您可以在不带参数的重写方法内实例化一个'Payment'(因此AmountPaid为0)。什么会给你一个期望,在这里除了0还有其他的东西? – 2012-03-05 17:10:55

+0

我已经试过了,并且没有使用amountPaid参数。我只是再试一次,仍然是零。当我调试它时,数据在离开“this.rtxtYourOrder.Text = orderObject.ToString();”时消失并转到ToString()方法 – 2012-03-05 17:19:56

回答

1

您的ToString提供了错误的付款信息,因为它确实无法访问您正在创建的付款对象。实例化new Payment没有帮助:您需要采用不同的方法。

解决此问题的一种方法是制作FormatWithPayment方法,而不是覆盖ToString。在业务代码中避免使用普通的ToString是一个好主意,并保留它以进行调试和记录。

public string FormatWithPayment(Payment paymentOrder) 
{ 
    return string.Format(" {0} Pizzas @ {1:C}: {2,8:C}\n" + 
     " {3} Cokes @ {4:C}: {5,8:C}\n" + 
     "  Order Amount: {6,8:C}\n" + 
     "    Sales Tax: {7,9:C}\n" + 
     "   Amount Due: {8,8:C}\n" + 
     "   Amount Paid: {9,9:C}\n\n" + 
     "    Change Due: {10,9:C}" 
     , NumberOfPizzas 
     , PIZZA_PRICE 
     , totalCostOfPizza 
     , NumberOfCokes 
     , COKE_PRICE 
     , totalCostOfCoke 
     , FoodAndDrinkTotal 
     , TotalSalesTax 
     , TotalAmountDue 
     , paymentOrder.AmountPaid 
     , GetChangeDue(totalAmountDue,amountPaid) 
     ); 
} 

这是几乎一样的代码,只支付对象是在现在通过。

现在你可以修改你的点击处理程序来使用这个新的方法,像这样:

this.rtxtYourOrder.Text = orderObject.FormatWithPayment(orderPaymentObject); 
+0

是的,这是做到了。谢谢。 – 2012-03-05 18:02:58

2

您的示例代码显示ToString()覆盖外部支付类。如果这是你的实际代码的真实表现,那么你就比其他Payment一些类中重写ToString()。该分析由您在该方法内实现的new Payment对象支持。

ToString()方法是一个实例方法。它应该返回调用它的实例的字符串表示如果你想获得一个Payment的字符串表示,该方法应该是Payment类的实例方法,它应该从该类的实例属性(以及可能的实例字段)得到其值。

使该方法成为Payment类的成员,并使用this.而不是paymentOrder.;这应该可以解决问题。

0

,我看到的第一件事情是,你的架构是关闭的。您有一个PizzaOrder作为Payment类的“排序”成员,而您的ToString()方法是(我假设)PizzaOrder类的成员。您不应该使用格式化方法来处理所有这些,而应该适当地关联您的对象。

比萨顺序应该有一个与之关联的支付,所以你应该有类似的一类结构:

public class PizzaOrder 
{ 

    ... 

    public Payment PaymentInfo { get; set; } 

    // then have your method: 
    // What ToString() method are you overriding? 
    // Does the baseclass for a pizza order already 
    // have a ToString()? 
    public override string ToString() 
    { 
     double paymentAmount = 0; 

     if (this.PaymentInfo != null) 
      paymentAmount = this.PaymentInfo.AmountPaid; 

     return string.Format(" {0} Pizzas @ {1:C}: {2,8:C}\n" + 
      " {3} Cokes @ {4:C}: {5,8:C}\n" + 
      "  Order Amount: {6,8:C}\n" + 
      "    Sales Tax: {7,9:C}\n" + 
      "   Amount Due: {8,8:C}\n" + 
      "   Amount Paid: {9,9:C}\n\n" + 
      "    Change Due: {10,9:C}", NumberOfPizzas, 
      PIZZA_PRICE, totalCostOfPizza, NumberOfCokes, COKE_PRICE, 
      totalCostOfCoke, FoodAndDrinkTotal, TotalSalesTax, 
      TotalAmountDue, paymentAmount, 
      GetChangeDue(totalAmountDue, paymentAmount)); 
    }  

} 

我想你需要彻底重新审视你的架构多一点,并建立自己的类之间更紧密的关系。

+0

能否请您解释一下公众Payment PaymentInfo {get;设置}?它看起来像一个属性,但什么是PaymentInfo? – 2012-03-05 18:21:28

+0

@ProgrammingNewbie:这只是该物业的名称。你必须以某种方式去解决它,并且由于该对象包含付款信息,所以它似乎是明智的。其背后的想法仅仅是通过亲子关系直接将支付信息与披萨订单连接起来。 – 2012-03-05 18:55:29