数据未到达覆盖的 ToString() 方法

本文关键字:ToString 方法 覆盖 数据 | 更新日期: 2023-09-27 18:26:39

我有一个重写的ToString()方法,我想输出格式化数据。这些数据由11个不同的项目组成。 我可以让除一个项目之外的所有项目正确显示,但该项目仅显示为 0。 不知何故,它没有达到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(倒数第二秒(。

我试过:

  • 通过在 ToString() 方法内部和外部实例化 OrderForm 对象,在 OrderFrom 类中传递 amountPaid 变量,
  • 通过在 ToString 方法内部和外部实例化 Payment 对象,在 Payment 类中传递 amountPaid 变量,以及
  • 调用在 toString 方法中将amountPaid变量输入为变量和属性。

老实说,我已经抓住了这么多稻草,我现在完全迷茫了,不知道该怎么办。

数据未到达覆盖的 ToString() 方法

您的示例代码显示了 Payment 类之外ToString()覆盖。 如果这是实际代码的真实表示,那么您已经覆盖了Payment以外的某个类的ToString()。 在方法中实例化new Payment对象支持此分析。

ToString()方法是实例方法。 它应该返回调用它的实例的字符串表示形式。 如果您尝试获取Payment的字符串表示形式,该方法应该是Payment类的实例方法,并且它应该从该类的实例属性(可能还有实例字段(中获取其值。

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

您的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);

我看到的第一件事是你的架构是关闭的。您有一个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));
    }     
}

我认为你需要更彻底地重新审视你的架构,并在你的类之间建立更牢固的关系。