Wywołaj metodę klasy potomnej z obiektu klasy nadrzędnej

Mam następujące klasy

class Person {
    private String name;
    void getName(){...}}

class Student extends Person{
    String class;
    void getClass(){...}
}

class Teacher extends Person{
    String experience;
    void getExperience(){...}
}

To tylko uproszczona wersja mojego rzeczywistego schematu. Początkowo nie znam typu osoby, która musi zostać utworzona, więc funkcja, która obsługuje tworzenie tych obiektów, przyjmuje ogólnePerson obiekt jako parametr.

void calculate(Person p){...}

Teraz chcę uzyskać dostęp do metod klas potomnych przy użyciu tego obiektu klasy nadrzędnej. Muszę też od czasu do czasu uzyskiwać dostęp do metod klasy macierzystejNIE MOŻEMY ZROBIĆ ABSTRACJI.

Wydaje mi się, że w powyższym przykładzie uprościłem zbyt wiele, więc tutaj chodzi o rzeczywistą strukturę.

class Question {
  // private attributes
  :
  private QuestionOption option;
  // getters and setters for private attributes
  :
  public QuestionOption getOption(){...}
 }

 class QuestionOption{
 ....
 }
 class ChoiceQuestionOption extends QuestionOption{
 private boolean allowMultiple;
 public boolean getMultiple(){...}
 }

 class Survey{
  void renderSurvey(Question q) {
      /*
          Depending on the type of question (choice, dropdwn or other, I have to render
          the question on the UI. The class that calls this doesnt have compile time 
          knowledge of the type of question that is going to be rendered. Each question 
          type has its own rendering function. If this is for choice , I need to access 
          its functions using q. 
      */
      if(q.getOption().getMultiple())
        {...}
  }
 }

Instrukcja if mówi „nie można znaleźć getMultiple dla QuestionOption”. OuestionOption ma o wiele więcej klas potomnych, które mają różne typy metod, które nie są powszechne wśród dzieci (getMultiple nie jest powszechne wśród dzieci)

questionAnswers(7)

yourAnswerToTheQuestion