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)