Hi,
I need to parse an XML record that represents a QuizQuestion. The "type" attribute tells the type of question. I then need to create an appropriate subclass of QuizQuestion based on the question type. The following code works ([auto]release statements omitted for clarity):
QuizQuestion *question = [[QuizQuestion alloc] initWithXMLString:xml];
if( [ [question type] isEqualToString:@"multipleChoiceQuestion"] ) {
[myQuestions addObject:[[MultipleChoiceQuizQuestion alloc] initWithXMLString:xml];
}
//QuizQuestion.m
-(id)initWithXMLString:(NSString*)xml {
self.type = ...// parse "type" attribute from xml
// parse the rest of the xml
}
//MultipleChoiceQuizQuestion.m
-(id)initWithXMLString:(NSString*)xml {
if( self= [super initWithXMLString:xml] ) {
// multiple-choice stuff
}
}
Of course, this means that the XML is parsed twice: once to find out the type of QuizQuestion, and once when the appropriate QuizQuestion is initialized.
To prevent parsing the XML twice, I tried the following approach:
// MultipleChoiceQuizQuestion.m
-(id)initWithQuizRecord:(QuizQuestion*)record {
self=record; // record has already parsed the "type" and other parameters
// multiple-choice stuff
}
However, this fails due to the "self=record" assignment; whenever the MultipleChoiceQuizQuestion tries to call an instance-method, it tries to call the method on the QuizQuestion class instead.
Can someone tell me the correct approach for parsing XML into the appropriate subclass when the parent class needs to be initialized to know which subclass is appropriate?