实现继承 - 无法使方法正常工作,尽管我的代码中的类似方法工作正常



下面是我的代码:

OrderListTest

package orderlisttest;
import java.util.Scanner;
import java.util.InputMismatchException;
public class OrderListTest {
public static void main(String[] args) {
Integer orderListSize = Input.getInteger("order list size: ");
OrderList orders = new OrderList(orderListSize);
Integer orderNumber;
Integer option;
do {
System.out.println("0: quit");
System.out.println("1: add order");
System.out.println("2: deliver order");
System.out.println("3: refund order");
System.out.println("4: pay order");
System.out.println("5: display unpaid credit orders");
System.out.println("6: display orders");
option = Input.getInteger("option: ");
switch (option) {
case 0:
System.out.println("quitting program");
break;
case 1:
System.out.println("1: credit order");
System.out.println("2: cash order");
Integer type = Input.getInteger("order type: ");
Integer number = Input.getInteger("number: ");
Integer value = Input.getInteger("value");
if (type == 1) {
try {
System.out.print("Paid? y/n");
Scanner scan = new Scanner(System.in);
String input = scan.nextLine();
if (input.equalsIgnoreCase("y")) {
orderNumber = selectOrder(orders);
orders.payOrder(orderNumber);
System.out.println("Paid");
} else if (input.equalsIgnoreCase("n")) {
System.out.println("Not paid");
}
} catch (InputMismatchException e) {
System.out.println("Invalid input!");
}
orders.addCreditOrder(number, value);
} else {
Boolean discountApplied = true;
orders.addCashOrder(number, value, discountApplied);
}
break;
case 2:
orderNumber = selectOrder(orders);
orders.deliverOrder(orderNumber);
break;
case 3:
orderNumber = selectOrder(orders);
orders.refundOrder(orderNumber);
break;
case 4:
orderNumber = selectOrder(orders);
orders.payOrder(orderNumber);
break;
case 5:
// self assessment 7 add code here
break;
case 6:
System.out.println(orders);
break;
default:
System.out.println("invalid option");
}
} while (option != 0);
}
private static Integer selectOrder(OrderList orders) {
Integer order;
System.out.println(orders);
order = Input.getInteger("order: ");
return order;
}
}

OrderList

package orderlisttest;
public class OrderList {
private Order[] orders;
private Integer numberOfOrders;
private Integer number;
public OrderList(Integer orderListSize) {
this.orders = new Order[orderListSize];
this.numberOfOrders = 0;
this.number = 1;
}
public String toString() {
String orderListDetails = new String();
if (this.numberOfOrders != 0) {
orderListDetails += String.format("%-10s%-10s%10s%15s%15s%15s%15sn", 
"NUMBER", "TYPE", "VALUE", "DELIVERED", "REFUNDED", "DISCOUNTED", "PAID");
for (Integer order = 0; order < this.numberOfOrders; order++) {
orderListDetails += this.orders[order] + "n";
}
} else {
orderListDetails += "order list is empty";
}
return orderListDetails;
}
public void addCreditOrder(Integer number, Integer value) {
this.orders[this.numberOfOrders] = new CreditOrder(number, value);
this.numberOfOrders++;
}
public void addCashOrder(Integer number, Integer value, Boolean discountApplied) {
this.orders[this.numberOfOrders] = new CashOrder(number, value, discountApplied);
this.numberOfOrders++;
}
public void deliverOrder(Integer number) {
Order order = this.getOrder(number);
order.deliverOrder();
}
public void refundOrder(Integer number) {
Order order = this.getOrder(number);
order.refundOrder();
}
public void payOrder(Integer number) {
Order order = this.getOrder(number);
order.payOrder();
}
private Order getOrder(Integer number) {
Order order = null;
Integer index = 0;
while (order == null) {
if (number.equals(this.orders[index].getNumber())) {
order = this.orders[index];
} else {
index++;
}
}
return order;
}
// self assessment 7 add code here
}

package orderlisttest;
public abstract class Order {
private Integer number;
protected Integer value;
private Boolean delivered;
protected Boolean paid;
protected Boolean refunded;
public Order(Integer number, Integer value) {
this.number = number;
this.value = value;
this.delivered = false;
this.paid = false;
this.refunded = false;
}
public String toString() {
String orderDetails = new String();
orderDetails += String.format("%-10d", this.number);
if (this instanceof CashOrder) {
orderDetails += String.format("%-10s", "Cash");
} else {
orderDetails += String.format("%-10s", "Credit");
}
orderDetails += String.format("%10d%15s%15s", this.value, this.delivered.toString(), this.refunded.toString());
return orderDetails;
}
public abstract void refund();
public void deliverOrder() {
this.delivered = true;
}
public void refundOrder() {
this.refunded = true;
}
public void payOrder() {
this.paid = true;
}
public Integer getNumber() {
return this.number;
}
}

CashOrder

package orderlisttest;
public class CashOrder extends Order {
private Boolean discountApplied;
public CashOrder(Integer number, Integer value, Boolean discountApplied) {
super(number, value);
this.discountApplied = discountApplied;
}
public String toString() {
String cashOrderDetails = new String();
cashOrderDetails += super.toString();
cashOrderDetails += String.format("%15s", this.discountApplied.toString());
return cashOrderDetails;
}
public void refund() {
this.refunded = true;
}
}

CreditOrder

package orderlisttest;
public class CreditOrder extends Order {
private Boolean paid;
public CreditOrder(Integer number, Integer value) {
super(number, value);
this.paid = false;
}
public String toString() {
String creditOrderDetails = new String();
creditOrderDetails += super.toString();
creditOrderDetails += String.format("%30s", this.paid.toString());
return creditOrderDetails;
}
public void pay() {
this.paid = true;
}
public void refund() {
if (this.paid) {
this.refunded = true;
}
}
// self assessment 7 add code here
}

由于某些我无法理解的原因,payOrder不起作用,订单总是没有付款,而deliverOrderrefundOrder工作良好。顺便说一下,是否有某种方法可以让它立即显示更新状态的订单,因为由于某种原因,当我退款订单或标记其已交付时,我必须运行displayOrder以查看更新的订单。还有,有人知道NetBeans中突出显示的淡绿色是什么意思吗?我一直在看,但似乎在网上找不到任何钥匙。TIA。

似乎你在层次路径上混合了一些变量:

结构如下:

[摘要]类顺序类CashOrder
  • 类CreditOrder

下一个变量在Order类中声明:

private Integer number;
protected Integer value;
private Boolean delivered;
protected Boolean paid;
protected Boolean refunded;

在CreditOrder中,您有这个:

private Boolean paid;

尽管CreditOrder已经有一个布尔值支付,它从Order类继承。因此,如果您在CreditOrder上调用setPaid(boolean paid),则需要在Order类中设置隐藏支付的本地变量。

但是,当您在Order上调用toString时,就像您在打印时所做的那样,您正在查看Order类中付费布尔值。

如果你想解决你的问题,删除

private Boolean paid;

行,这样,您将修改正确的变量。

最新更新