java - OOP 票价计划

标签 java oop if-statement while-loop

所以这个有点长。我正在尝试完成一个票价根据购买日期而变化的节目。我需要 Tester.Java 从对象中获取信息,并根据门票类型输出适当的价格。我已经在测试器中设置了一组 if 语句,但我现在对如何完成这个程序陷入了僵局。我将在下面粘贴我的代码。

测试器(包含主要方法):

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();            
    }        
  }   
}

门票( super 舱):

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; 
  }
}

步行票:

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 新手,所以我在这方面遇到了一些麻烦。

最佳答案

您应该为所有购买的门票节省总计,还是一次只保存一张门票的总计?

对于现场门票,您无需执行任何操作。总共 50 美元。

对于 Advance 和 StudentAdvance,您将创建该类型的新对象,并且构造函数将提前多少天显示菜单,以及不显示什么。然后您可以从中得到总数。

至于你的代码结构并不理想。对象的构造函数中不应包含所有代码。他们应该有一个 ShowMenu 函数,可以向用户显示菜单并读取他们的输入。构造函数大部分应该是空白的。

您也不需要三个不同的票证对象。一个票证对象应该能够自行处理所有这些。票证对象可以显示菜单并根据用户输入处理不同的价格。如果您需要保存总计或不同的票证,您可以在 main 方法上拥有一组票证对象。然后,您可以循环该数组来显示或求和票证。

希望这有帮助。

关于java - OOP 票价计划,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43811302/

相关文章:

使用 R 重新分配定向(圆形)数据中的位置

java - 使用 Gson lib 将 Json 转换为 Java 对象

java - 在所有实现中向我的接口(interface)的每个实现添加另一个方法

java - Firebase Firestore 库导致 : java. lang.RuntimeException : com. android.builder.dexing.DexArchiveMergerException:无法合并 dex

java - 将武器作为抽象类的接口(interface)有什么优势

c - C : good, 中的继承不好,还是其他?

javascript - 逻辑运算符两侧的 if 语句中的多个条件

mysql - 同时获取列的最大值和特定记录的同一列

java - 使用全局 Hook 从条形码扫描仪读取数据

java - 定义自定义问题 :inputType for ClearableEditText