所以这个有点冗长。我正在尝试完成一个程序,其中票价根据购买日期而有所不同。我需要Tester.Java从对象中获取信息,并根据票证类型输出适当的价格。我已经在测试程序中设置了一组if语句,但我现在对如何完成此程序有所了解。我将在下面粘贴我的代码。
Tester(包含主要方法):
package tester;
import java.util.Scanner;
public class Tester extends Ticket{
/**
* @param args the command line arguments
*/
public static void main(String[] args){
Scanner db = new Scanner(System.in);
Ticket firstTicket = new Ticket();
System.out.println("The first ticket: "+firstTicket.toString());
int x = 0;
while(x!=2){
if(x==2){
System.out.println("Goodbye.");
}
else{
System.out.println("What type of ticket are you purchasing?");
System.out.println("1.Walk Up");
System.out.println("2.Advance");
System.out.println("3.Student Advance");
int t = db.nextInt();
if(t==1){
}
if(t==2){
}
if(t==3){
}
}
System.out.println("Do you need another ticket?");
x= db.nextInt();
}
}
}
门票(超级班):
package tester;
import java.util.Scanner;
public class Ticket {
public int ticket;
public double price;
/**
* holds default values for ticket number and price
*/
public Ticket(){
super();
this.ticket=1;
this.price=15.0;
}
/**
* Stores the values for ticket number and the price, based upon ticket type
* @param ticket
* @param price
*/
public Ticket(int ticket, double price){
this.ticket=ticket;
this.price=price;
}
/**
* returns the value of price
* @return price
*/
public double getPrice(){
return price;
}
@Override
public String toString(){
return "Ticket #" + ticket + " Ticket price: $"+ price;
}
}
Walkup Ticket:
package tester;
/**
*
* @author dylan
*/
public class WalkupTicket extends Ticket{
/**
* holds the price of a walkup ticket 50$
*/
public WalkupTicket(){
this.price=50;
ticket++;
}
}
预售票:
package tester;
import java.util.Scanner;
public class AdvanceTicket extends Ticket {
/**
* stores the values of an advance ticket, depending on how many days before
* the event it is purchased
*/
public AdvanceTicket(){
Scanner db = new Scanner(System.in);
System.out.println("How many days before the event are you purchasing your ticket?");
int days = db.nextInt();
// days before is 10 or less days
if(days >= 10){
price=30;
ticket++;
}
// days before is more than 10
else{
this.price=40;
ticket++;
}
}
}
学生预售票:
package tester;
import java.util.Scanner;
public class StudentAdvanceTicket extends AdvanceTicket{
/**
* stores the values of an advance ticket, depending on how many days before
* the event it is purchased, with student discount.
*/
public StudentAdvanceTicket(){
Scanner db = new Scanner(System.in);
System.out.println("How many days before the event are you purchasing your ticket?");
int days = db.nextInt();
System.out.println("Are you a student?");
System.out.println("1. Yes");
System.out.println("2. No");
int stud = db.nextInt();
// days before is 10 or less days
if(days >= 10 && stud == 1){
price=15;
ticket++;
}
// days before is more than 10
if(days <= 10 && stud == 1){
this.price=20;
ticket++;
}
}
}
我觉得我犯的是一个简单的错误,但我是OOP的新手,所以我对此有点麻烦。
答案 0 :(得分:1)
您是否应该为所有购买的门票保存总额,或者一次只保存一张门票?
对于步行门票,您不必做任何事情。它总共50美元。
对于Advance和StudentAdvance,您将创建一个该类型的新对象,并且您拥有它的方式构造函数将显示提前多少天的菜单。然后,您可以从中获得总数。
至于你的代码结构,它并不理想。对象的构造函数不应该包含所有代码。他们应该有一个ShowMenu函数,它将向用户显示菜单并读取他们的输入。构造函数在大多数情况下应该是空白的。
您也不需要三个不同的票证对象。一个票证对象应该能够自己处理所有这些。故障单对象可以显示菜单并根据用户输入处理不同的价格。如果需要保存总票数或不同票证,则可以在main方法上拥有一组票证对象。然后,您可以遍历该数组以显示或汇总票证。
希望这有帮助。
答案 1 :(得分:0)
你的问题非常广泛,但是对你的意见有些想法:
tester
说没有。你可以称它为dylan.tickets
例如:明确A)你的东西和B)它是关于那个票系统AdvancedTicket at = new AdvancedTicket(100);
之类的内容 - 因为现在您可以轻松编码各种不同的对象;并一次又一次地启动你的程序。您当前的解决方案要求您手动输入所有此类数据...每次重新启动程序时!所以:构造函数中没有扫描仪使用。决不!A extends B
放在任何地方。绝对没有理由让您的Tester类扩展 Ticket。测试人员是测试人员,而不是门票!如上所述:最后一点是最重要的一点。你是小心关于使A成为B的子类;通常情况下,让A 拥有 B对象更合适,但不能使A成为B!