数据未到达覆盖的 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
变量输入为变量和属性。
老实说,我已经抓住了这么多稻草,我现在完全迷茫了,不知道该怎么办。
您的示例代码显示了 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));
}
}
我认为你需要更彻底地重新审视你的架构,并在你的类之间建立更牢固的关系。