2017-05-05 79 views
1

所以这一个是有点冗长。我试图完成一个程序,其中机票价格取决于购买日期。我需要Tester.Java从对象中获取信息,并根据票证类型输出适当的价格。我已经在测试人员中设置了一组if语句,但我现在正处于如何完成这个程序的过程中。我将在下面粘贴我的代码。OOP票价计划

测试仪(包含主法):

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

摩天票:

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

这不是你的问题清楚你的错误是什么导致你是从你的程序 – CocoNess

+0

尼斯期望问题,虽然有点广阔。而且:细节很重要。请看看我如何重新格式化您的输入以使其更快/更易于阅读。 – GhostCat

回答

1

您是否应该为所有购买的门票总额或总共一张门票总额节省?

对于步行票你不必做任何事情。它的总价值是50美元。

对于Advance和StudentAdvance,您将创建一个该类型的新对象和您拥有它的方式构造函数将显示提前多少天的菜单,以及哪些不是。你可以从中得到总数。

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

您也不需要三个不同的票证对象。一个票据对象应该能够自己处理所有这些。票证对象可以显示菜单并根据用户输入处理不同的价格。如果您需要保存总票或不同票,则可以在主方法上包含一系列票证对象。然后,您可以遍历该数组来显示或汇总票据。

希望这会有所帮助。

+0

不幸的是,这个程序需要有三个单独的票据对象。我宁愿用简单的方法调用它,但我被要求用OOP来做。 – DPabst

+0

好的。然后你仍然想把代码从构造函数中提取出来并放入方法中。在主票证对象中,您可以创建一个名为ShowMenu的抽象方法。然后在扩展Ticket的类中,您将不得不在其中实现一个名为ShowMenu的方法。然后每个人都可以显示属于他们的菜单。 – HarvP

+0

@HarvP很好的答案,进入oop细节;有我的投票权。关于这段代码的其他方面,我提出了另一个问题。反馈是受欢迎的。 – GhostCat

0

你的问题是相当广泛的,但远,您输入的一些想法:

  • 问题。你做了第一步,并且你正在使用一个特定的包(而不是默认的包)是很好的;但tester没什么。举例来说,你可以称之为dylan.tickets:A)它是你的东西,B)它是关于那张票系统
  • 看来你对你的工作很认真,因此:不要用静态主来驱动测试用例。使用JUnit和简单的测试用例非常简单。除此之外:使用主体进行“手动”驾驶测试是麻烦且容易出错的。单元测试几乎可以自动进行。
  • 更重要的是:测试,只是打印的东西几乎是无用的。如果您的代码出乎意料地运行,您可能只会在仔细检查打印的输出时注意到。如上所述:使用单元测试,Junit断言调用来检查方法调用的预期与实际结果。因为那时你会被告知什么时候你做出了破坏以前工作的功能的改变。
  • 绝对避免要求用户输入在很多不同的地方。含义:合理的是一个类有一个构造函数或setter方法;并且实例化新对象所需的所有参数都是,因为就是该对象。如果有的话,您的主要使用扫描仪并要求用户输入。但是,所有“业务逻辑”对象完全不需要任何“用户交互”。你看,你实际上想要开始整个项目没有使用扫描仪。你想硬编码之类的东西AdvancedTicket at = new AdvancedTicket(100); - 因为现在你可以很容易地代码各种不同的物体;并一次又一次地开始你的程序。您目前的解决方案要求您手动输入所有这些数据......每次重新启动程序时!所以:在构造函数中没有使用扫描器。决不!
  • 然后:良好的面向对象是大约行为,不是状态。含义:您不要使用public字段来传播信息。如果有的话,你的领域应该是保护;但即使这通常也不是一个好主意。你想隔离你的班级彼此...
  • 核心问题:似乎没有人告诉过你关于FCoI。你应该支持组合继承。含义:你不只是把A extends B无处不在。绝对没有理由,您的测试仪类延伸票。测试人员是一名测试人员,而不是一张票!

象曰:最后一点是最重要的一个。你是小心关于使A成为B的一个子类;很多时候,更合适的可能是拥有一个B对象,但不能使A A B!