Java继承与多态问题:如何获取三种题型类的答案?
嘿,我完全懂你刚接触继承和多态时的困惑——这俩概念一开始确实容易绕晕。你的问题核心很明确:父类Question的getAnswer()和checkAnswer()方法没有设计成支持多态的形式,而且子类也没重写这两个方法,所以当你通过父类引用调用它们时,只会执行父类里的空实现,自然拿不到子类中存储的真实答案。
下面我给你一步步梳理解决方案:
第一步:重构父类Question为抽象类
既然Question是所有题型的父类,它本身并不对应具体的题目类型,所以把它改成抽象类,并将getAnswer()和checkAnswer()定义为抽象方法,强制每个子类必须实现自己的版本:
public abstract class Question { private String question; public Question(String question) { this.question = question; } public String getQuestion() { return question; } // 抽象方法:子类必须实现获取答案的逻辑 public abstract String getAnswer(); // 抽象方法:子类必须实现验证答案的逻辑 public abstract boolean checkAnswer(String ans); }
第二步:给每个子类重写抽象方法
现在每个子类都需要实现getAnswer()和checkAnswer(),根据题型的特性定制逻辑:
1. ShortAnswerQuestion(简答题)
public class ShortAnswerQuestion extends Question { private String answer; public ShortAnswerQuestion(String question, String answer) { super(question); this.answer = answer; } @Override public String getAnswer() { return answer; } @Override public boolean checkAnswer(String ans) { // 忽略大小写和前后空格,提升用户体验 return answer.equalsIgnoreCase(ans.trim()); } }
2. FillInBlankQuestion(填空题)
public class FillInBlankQuestion extends Question { private String answer; public FillInBlankQuestion(String question, String answer) { super(question); this.answer = answer; } @Override public String getAnswer() { return answer; } @Override public boolean checkAnswer(String ans) { // 填空题同样忽略空格和大小写 return answer.equalsIgnoreCase(ans.trim()); } }
3. TrueFalseQuestion(判断题)
这里可以优化一下,用boolean类型存储答案比String更严谨:
public class TrueFalseQuestion extends Question { private boolean answer; public TrueFalseQuestion(String question, String answer) { super(question); // 将输入的字符串转为boolean类型 this.answer = "TRUE".equalsIgnoreCase(answer.trim()); } @Override public String getAnswer() { return answer ? "TRUE" : "FALSE"; } @Override public boolean checkAnswer(String ans) { String trimmedAns = ans.trim(); // 支持多种输入格式:TRUE/true/T/t 都算对,FALSE/false/F/f 都算错 boolean userAnswer = "TRUE".equalsIgnoreCase(trimmedAns) || "T".equalsIgnoreCase(trimmedAns); return userAnswer == answer; } }
为什么这样改?
这就是多态的核心:当你用Question类型的引用指向子类对象时(比如myQuestions里的元素),调用getAnswer()和checkAnswer()会自动执行子类重写后的方法,而不是父类的空实现。这样你的SimpleQuiz里的getCurrentAnswer()和checkCurrentAnswer()就能正确获取和验证每个题型的答案了。
现在你可以运行代码测试一下,应该就能正常拿到各个子类的答案啦!
内容的提问来源于stack exchange,提问作者pokoyo
相关产品推荐
相关产品推荐

