2017-03-20 9 views
0

私はさまざまな種類のチケットを持つプログラムを持っています。私はTicketAdvanceTicket、およびStudentAdvanceTicketを持っています。私はチケットの価格$ 50、前売券$ 30と$ 40の両方のオプションを印刷しています)と、学生の前売券$ 15と$ 20の両方のオプションを印刷しています。継承のあるJavaチケットプログラム

両方のオプションは、条件が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) "; 
    } 
} 

これは私の希望する出力です。あなたがStudentAdvanceTicketためgetPrice()を呼び出すと

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) 
+0

あなたの問題は何ですか? – Justas

+0

何が問題になるのかははっきりしません。 – freedev

+2

'super.price' ??? 1.そのようなフィールドはありません。2.そのようなフィールドがあっても、継承クラスからprivateメンバーにアクセスすることはできません。 – alfasin

答えて

2

は、あなたのプログラムは、実際には$ 30〜$ 40が返されますAdvanceTicketから実装を呼び出します。あなたがStudentAdvanceTicketためtoString()を呼び出すとき

は今、それがAdvanceTicketのための1つである、superからtoStringを呼び出し、その一つは、再び、たったの$ 30〜$ 40返し、ことはありません、オブジェクトのgetPrice()メソッドを呼び出し、メンバー変数priceの使用。

正しい解決策は、StudentAdvanceTicketクラスの場合はgetPriceを上書きすることです。その方法では、super.getPrice()に電話し、その価格操作を行います。

1

StudentAdvanceTicketsuper.priceを解決できないため、コンパイルエラーが発生します。