我有一个带有不同类型门票的程序。我有Ticket
,AdvanceTicket
和StudentAdvanceTicket
。我正在打印机票价格50美元,预售票价格分别为30美元和40美元,学生预售票价格分别为15美元和20美元。
这两个选项的条件均为if daysAhead >= 10
。
我已经花了数小时试图解决这个问题,我需要帮助。
Ticket.java
public class Ticket {
private int number;
public Ticket(int number) {
this.number = number;
}
public double getPrice() {
return 50.0;
}
public String toString() {
return "Ticket #" + this.number + ", Price: $" + this.getPrice();
}
}
TicketMain.java
public class TicketMain {
public static void main(String[] args) {
Ticket[] tickets = new Ticket[5];
tickets[0] = new WalkupTicket(1);
tickets[1] = new AdvanceTicket(2,12);
tickets[2] = new AdvanceTicket(3,8);
tickets[3] = new StudentAdvanceTicket(4,17);
tickets[4] = new StudentAdvanceTicket(5,7);
for (int i = 0; i<5; i++) {
System.out.println(tickets[i]);
//System.out.println(" ");
}
}
}
AdvanceTicket.java
public class AdvanceTicket extends Ticket {
private int daysAhead;
public AdvanceTicket(int number, int daysAhead) {
super(number);
this.daysAhead = daysAhead;
}
public double getPrice() {
if (daysAhead >= 10) {
return 30.00;
} else {
return 40.00;
}
}
public String toString() {
if (daysAhead >= 10) {
return super.toString() + " (" + this.daysAhead + " days ahead, you got a great deal!)";
} else {
return super.toString() + " (" + this.daysAhead + " days ahead, you could have saved a bit more)";
}
}
}
最后是问题...
StudentAdvanceTicket.java
public class StudentAdvanceTicket extends AdvanceTicket {
public StudentAdvanceTicket(int number, int daysAhead) {
super(number, daysAhead);
super.price = super.getPrice() / 2;
}
public String toString() {
return super.toString() + " (ID Required) ";
}
}
这是我想要的输出。
Ticket #1, Price: $50.0
Ticket #2, Price: $30.0 (12 days ahead, you got a great deal!)
Ticket #3, Price: $40.0 (8 days ahead, you could have saved a bit more)
Ticket #4, Price: $15.0 (ID Required)
Ticket #5, Price: $20.0 (ID Required)
最佳答案
当您为getPrice()
调用StudentAdvanceTicket
时,您的程序实际上从AdvanceTicket
调用实现,该实现将返回$ 30或$ 40。
现在,当您为toString()
调用StudentAdvanceTicket
时,它会从toString
调用super
,这是AdvanceTicket
的那个,而那个调用对象的getPrice()
方法,该方法再次返回$ 30或$ 40,并且不使用price
成员变量。
正确的解决方案是为getPrice
类覆盖StudentAdvanceTicket
。在该方法中,您调用super.getPrice()
,然后进行价格操纵。
关于java - 带有继承的Java Ticket程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42915954/