Как вызвать метод получения из подкласса, который не имеет абстрактного объявления в суперклассе - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть суперкласс, который я создаю как ArrayList. Подкласс суперкласса сохраняется в ArrayList. Теперь я хочу получить информацию из ArrayList, но метод получения атрибута доступен только в подклассе. Я могу получить информацию (которая также сохраняется в 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;
    }  
}        

Чтобы обойти проблему, я реализовал «вспомогательный метод» в классе Вопрос:

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

Который я вызываю из класса QuestionPool:

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

1 Ответ

0 голосов
/ 08 апреля 2020

Поскольку объекты в списке хранятся как тип суперкласса, вам придется привести его к подклассу, прежде чем вы сможете получить доступ к методам подкласса. Вот как выглядит приведение типов:

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

Хотя это может ответить на ваш вопрос, предоставленный вами код вообще не требует инициализации Списка суперклассом. Если бы у вас было два разных подкласса и они были сохранены в одном и том же списке, только тогда имело бы смысл это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...