2012-03-05 102 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

相關問題