2012-03-05 16 views
3

オーバーライドされたToString()メソッドを使用して、書式設定されたデータを出力します。このデータは11種類の項目で構成されています。私は1つのアイテムだけを表示して、正しく表示することができますが、1つのアイテムは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(最後から2番目)です。

私が試した:

  • を両方の内側とToString()方法の外OrderFormオブジェクトをインスタンス化することによってOrderFromクラスにamountPaid変数を渡し、
  • PaymentクラスにamountPaid変数を渡すインスタンス化オブジェクトの内側と外側の両方にオブ​​ジェクトがあり、
  • と入力すると、amountPaid va変数として、およびプロパティとしてtoStringメソッド内でリライブルです。

私は今、完全に混乱していますので、多くのストローで把握し、何をすべきか見当がつかないました正直に言うと。

+3

あなたはそれがなぜ期待されますか?オーバーライドされたメソッドの中でパラメータなしで(つまり、AmountPaidの場合は0)、 'new Payment'をインスタンス化します。ここに0以外のものがあるとあなたに期待するものは何ですか? –

+0

私はamountPaidパラメータの有無にかかわらず試しました。私はもう一度それを試して、まだゼロを取得します。私がそれをデバッグすると、データは "this.rtxtYourOrder.Text = orderObject.ToString();"を残すと消えます。 ToString()メソッド –

答えて

1

お客様のToStringは、正直言って、作成している支払いオブジェクトにアクセスできないため、間違った支払い情報を提供します。インスタント化new Paymentは役に立ちません。ここでは別のアプローチが必要です。

ToStringを上書きするのではなく、FormatWithPaymentメソッドを作成することがこの問題の1つの方法です。 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

に行きました。それはそうでした。ありがとうございました。 –

2

あなたのサンプルコードは、ToString()の無効化を、お支払い方法のの外側に示しています。これが実際のコードを実際に表している場合、Payment以外のクラスではToString()が上書きされています。この分析は、メソッド内のnew Paymentオブジェクトのインスタンス化によってサポートされます。

ToString()メソッドはインスタンスメソッドです。呼び出されるインスタンスの文字列表現を返します。Paymentの文字列表現を取得しようとする場合、メソッドはPaymentクラスのインスタンスメソッドであり、そのクラスのインスタンスプロパティ(場合によってはインスタンスフィールド)からその値を取得する必要があります。

このメソッドをPaymentクラスのメンバにし、paymentOrder.ではなくthis.を使用します。これは問題を解決するはずです。

0

私が見る最初の事はあなたのアーキテクチャがオフになっていることです。 Paymentクラスの「並べ替え」メンバーとしてPizzaOrderがあり、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

あなたは公的支払いPaymentInfo {get;セット}?それは財産のように見えますが、PaymentInfoは何ですか? –

+0

@ProgrammingNewbie:それはちょうどプロパティの名前です。あなたは何とかそれにアクセスしなければなりません。そのオブジェクトには支払い情報が含まれているので、それは賢明だったようです。その背後にある考え方は、支払い情報を親子関係を通じてピザ注文に直接接続することです。 –

関連する問題