如何实现Java多题型测验程序不输出true/false布尔值
解决测验题答案判断自定义输出的方案
嘿,我完全懂你的处境——没法修改Question.java和ChoiceQuestion.java里的public boolean CheckAnswer()方法,但又不想在判断答案时输出布尔值,而是要显示指定的"Correct answer :)"或"Wrong answer :("提示。别发愁,有两个简单的方案能搞定这个,完全不用动父类的代码:
方案一:在各题型子类中新增专属的输出方法
既然不能改父类的方法,那咱们就在每个自定义题型子类(AnyCorrectChoiceQuestion、FillInQuestion、NumericQuestion)里加一个专门用来处理输出的方法。这个方法内部调用父类的CheckAnswer()获取判断结果,再根据结果输出对应提示。
举个FillInQuestion的实现例子:
public class FillInQuestion extends Question { // 这里是你已有的子类代码,比如题干设置、答案存储逻辑等 // 新增的答案检查并输出方法 public void checkAndShowResult(String userAnswer) { boolean isCorrect = super.CheckAnswer(userAnswer); if (isCorrect) { System.out.println("Correct answer :)"); } else { System.out.println("Wrong answer :("); } } }
之后你在测验逻辑里,直接调用这个checkAndShowResult()方法就行,完全不会触发布尔值的输出。
方案二:用工具类统一处理所有题型
如果不想在每个子类里重复写代码,还可以创建一个独立的工具类,把答案检查和输出的逻辑封装进去,适配所有Question的子类。
比如创建QuestionResponseHandler类:
public class QuestionResponseHandler { // 静态方法,接收任意Question子类对象和用户答案 public static void evaluateAndDisplay(Question question, String userInput) { // 针对NumericQuestion,先处理输入类型转换 boolean isCorrect; if (question instanceof NumericQuestion) { try { double numericAnswer = Double.parseDouble(userInput); // 假设NumericQuestion的CheckAnswer重载了接收double的版本 isCorrect = ((NumericQuestion) question).CheckAnswer(numericAnswer); } catch (NumberFormatException e) { // 输入不是有效数字,直接判定错误 isCorrect = false; } } else { isCorrect = question.CheckAnswer(userInput); } // 输出自定义提示 System.out.println(isCorrect ? "Correct answer :)" : "Wrong answer :("); } }
使用的时候只需要一行代码:QuestionResponseHandler.evaluateAndDisplay(currentQuestion, userAnswer);,不管是哪种题型都能处理,还能顺便解决NumericQuestion的输入类型转换问题。
小提醒
- 一定要确保你的测验逻辑里调用的是上述新方法,而不是直接调用父类的
CheckAnswer(),不然还是会返回布尔值; - 如果
NumericQuestion的CheckAnswer()方法接收的是数值类型(比如int/double),记得在处理用户输入时做好类型转换,避免报错。
内容的提问来源于stack exchange,提问作者John Wintroub
相关产品推荐
相关产品推荐

