You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:53:04