【问题标题】:How to call a getter from a subclass which hasn't an abstract declaration in the superclass如何从超类中没有抽象声明的子类调用getter
【发布时间】:2020-04-07 21:02:16
【问题描述】:

我有一个超类,我将其实例化为 ArrayList。超类的子类保存在 ArrayList 中。现在我想从 ArrayList 中获取信息,但是属性的 getter 只在子类中可用。我可以从在抽象超类中具有抽象声明的其他类中获取信息(也保存在 ArrayList 中)。但是,我不喜欢在所有扩展超类的类中实现“虚拟”方法。

代码被截断:

public class Question{

        QuestionPool() {
         questionPool = new ArrayList<Question>();
         ClozeQuestions q15 = new ClozeQuestions("Erster Text", "Zweiter Text");
         questionPool.add(q15);
        }
         public int startQuiz{
         System.out.printf("Q: %s", questionPool.get(i).?????
        }
}

public abstract class Question {

    String question;
    public String getQuestion() {
    return question;
    }
}

public class ClozeQuestions extends Question {

    ClozeQuestions(String questionPart1, String questionPart2){
        this.questionPart1 = questionPart1;
        this.questionPart2 = questionPart2;
    }

    public String getQuestionPart1() {
        return questionPart1;
    }

    public String getQuestionPart2() {
        return questionPart2;
    }  
}        

为了规避这个问题,我在 Question 类中实现了一个“辅助方法”:

        ClozeQuestions question2ClozeQuestion = new ClozeQuestions();
        return question2ClozeQuestion.getQuestionPart1();
    }

我从 QuestionPool 类中调用:

System.out.printf("Q: %s", questionPool.get(i).getQuestionPart1());

【问题讨论】:

  • 嗯,您的代码中有多个编译错误。您的助手也没有任何意义,它是从 ClozeQuestions 的新实例中提取的,其中没有任何值。为什么您将列表输入为List&lt;Question&gt; 而不是List&lt;ClozeQuestions&gt;?
  • 如果只添加这种类型,为什么questionPool 是ArrayList&lt;Question&gt; 而不是ArrayList&lt;ClozeQuestions&gt;。如果还有其他问题类型,getQuestionPart1 对这些问题的期望结果是什么?
  • ArrayList 还必须保存其他类型。其他问题类型有其他结构。

标签: java oop


【解决方案1】:

由于列表中的对象存储为超类的类型,因此您必须先将其强制转换为子类,然后才能访问子类方法。这就是类型转换的样子:

(Subclass)objectOfSuperclassType

为了安全起见,您应该在强制转换之前键入 check,这可以使用 'instanceof' 来完成:

if (objectOfSuperclassType instanceof Subclass) {
    Subclass objectOfSubclassType = (Subclass)objectOfSuperClass
}

最后,一个在处理列表时如何实现的示例:

List<Superclass> myList = new ArrayList<>();
myList.add(new Subclass());

if (myList.get(0) instanceof Subclass) {
        System.out.println( ((Subclass) myList.get(0)).getSomeString() );
}

虽然这可能会回答您的问题,但您提供的代码根本不需要使用超类初始化 List。如果您有两个不同的子类并将它们存储在同一个列表中,那么这样做才有意义。

【讨论】:

    猜你喜欢
    • 2014-02-26
    • 2023-03-20
    • 2020-04-12
    • 2023-03-11
    • 2020-02-15
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    相关资源
    最近更新 更多