我有一个带有不同类型门票的程序。我有TicketAdvanceTicketStudentAdvanceTicket。我正在打印机票价格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/

10-10 13:51