2012-03-05 2 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 класса, создания экземпляра объекта OrderForm как внутри, так и вне метода ToString(),
  • передавая переменную amountPaid в Payment классе по инстанцировании a Payment объект как внутри, так и снаружи метода ToString и
  • вызов ввода amountPaid va применимы в методе toString как переменная и как свойство.

Чтобы быть честным, я схватил столько соломинок, что теперь я полностью смущен и понятия не имею, что делать.

+3

Почему вы ожидаете, что это будет? Вы создаете «новый платеж» внутри переопределенного метода без параметров (таким образом, 0 для суммы). Что бы вы ожидали, что здесь будет что-то другое, кроме 0? –

+0

Я пробовал это как с параметром amountPaid, так и без него. Я просто попробовал еще раз, все равно получаю ноль. Когда я отлаживаю его, данные исчезают, когда он покидает «this.rtxtYourOrder.Text = orderObject.ToString();» и переходит к методу ToString() –

ответ

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

Да, это так. Спасибо. –

2

Ваш образец кода показывает ToString() переопределение наружу Класс оплаты. Если это истинное представление вашего фактического кода, то вы переопределили ToString() на некоторый класс, отличный от Payment. Этот анализ поддерживается вашим экземпляром объекта 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? –

+0

@ProgrammingNewbie: Это будет просто имя свойства. Вы должны как-то добраться до него, и поскольку этот объект содержит информацию о платежах, он кажется разумным. Идея заключается в том, чтобы просто подключить платежную информацию непосредственно к порядку пиццы через отношения родитель-ребенок. –