gpt4 book ai didi

java - 如何从父类(super class)中没有抽象声明的子类调用 getter

转载 作者:行者123 更新时间:2023-12-01 17:32:40 24 4
gpt4 key购买 nike

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

代码被截断:

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());

最佳答案

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

(Subclass)objectOfSuperclassType

为了安全起见,您应该在强制转换之前输入检查,这可以通过“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() );
}

尽管这可能会回答您的问题,但您提供的代码根本不需要使用父类(super class)来初始化列表。如果您有两个不同的子类并将它们存储在同一个列表中,只有这样才有意义。

关于java - 如何从父类(super class)中没有抽象声明的子类调用 getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61089364/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com